2016-11-09 95 views
2

我有這種形式的文本數據中提取字符串:使用sed來從文本文件

^Well/Well[ADV]+ADV ^John/John[N]+N ^has/have[V]+V+3sg+PRES ^a/a[ART] 
^quite/quite[ADV]+ADV ^different/different[ADJ]+ADJ ^not/not[PART] 
^necessarily/necessarily[ADV]+ADV ^more/more[ADV]+ADV 
^elaborated/elaborate[V]+V+PPART ^theology/theology[N]+N *edu$ 

而且我希望它被加工成這種形式:

Well John have a quite different not necessarily more elaborate theology 

基本上,我需要每字符串起始字符/和結束字符[之間的字符串。

這裏是我試過,但我只是得到空文件...

#!/bin/bash 

for file in probe/*.txt 

do sed '///,/[/d' $file > $file.aa 

mv $file.aa $file 

done 
+0

嘗試轉義您的開始字符:'///' - >'/ \ //' –

+0

仍然會給我空文件:/ – Jakob

回答

4

awk來救援!

$ awk -F/ -v RS=^ -v ORS=' ' '{print $1}' file 

Well John has a quite different not necessarily more elaborated theology 

說明組記錄分隔符(RS)到^來分離的邏輯組,還設置字段分隔符(FS),以/和打印第一字段作爲您的要求。最後,將輸出字段分隔符(OFS)設置爲空格(而不是默認的新行)將提取的字段保留在同一行上。

+0

是的,這很有用,謝謝! !如果你能向我解釋不同的論點意味着什麼,我會非常感激! – Jakob

-1
cat file|grep -oE "\/[^\[]*\[" |sed -e 's#^/##' -e 's/\[$//' | tr -s "\n" " " 
+1

雖然此代碼段可能會解決問題,但並不能解釋它爲什麼或如何回答這個問題。請[請提供您的代碼解釋](// meta.stackexchange.com/q/114762/269535),因爲這確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 **舉報人/評論者:** [僅限代碼解答,例如這個,downvote,不要刪除!](// meta.stackoverflow.com/a/260413/2747593) –

2

隨着GNU的grep和Perl兼容的正則表達式(-P):

$ echo $(grep -Po '(?<=/)[^[]*' infile) 
Well John have a quite different not necessarily more elaborate theology 

-o保留只是比賽,(?<=/)爲正向後看(「確保有一個/,但不包括它在比賽中「),並且[^[]*是」除[以外的字符序列「。

grep -Po每行打印一個匹配;通過使用grep的輸出作爲echo的參數,我們將換行符轉換爲空格(也可以通過管道連接到tr '\n' ' ')。

+0

錯字...應該是''(?<= /)[^ [] *''..一個額外的''/''在開始處留下..也可以使用''/ \ K [^ [] *' ' – Sundeep

+1

@sundeep我起初是'\ K',那是'''''''''''謝謝! –