2014-03-28 30 views
1

我用正則表達式掙扎月底桑達REGEXP捕獲使用sed的 我讀書與行殼牌 - 從一個字,直到最終的逗號和線

word1 word2 myword word4 word5 word6, 
lorem ipsum dolor amet myword asinus es 
salut comment ca va myword c'est comme ca, 

我想

word1 word2, 
lorem ipsum dolor amet 
salut comment ca va, 
文件

這只是我的文件的一部分,這就是爲什麼我需要通過線工作才行。 所有我能找到的:

echo $line | sed -e 's/\(myword.*\)\(,\)$/\2/g' 

但我只得到

word1 word2, 
lorem ipsum dolor amet myword asinus es 
salut comment ca va, 

如果有最後一個逗號或不我無法捕捉。誰能幫我 ?

的問題是更多:我想在「myWord」之前的所有內容,並保持最後一個逗號,如果我有一個使用正則表達式SED

感謝

+0

你試圖讓一切之前在「myWord」(在這種情況下,爲什麼逗號?)或一切myword之後(在這種情況下,爲什麼只有3輸出線1「BLAS」),或在每行的最後3場或別的東西?請更新您的樣本輸入,期望的輸出和說明以澄清。 –

+0

我想在「myWord」之前得到的一切,並保持最後一個逗號,如果我使用sed的正則表達式 – toch

+0

剛剛更新的問題有一個。你能看看你的預期產出嗎?這似乎矛盾 - 2行包含'myword'和一個沒有。最好解釋一下? – devnull

回答

1

你可以使用一個標籤。檢查線路以逗號結束,並採取相應的行動:

sed -e '/,$/{s/\(myword.*\)\(,\)$/\2/; ba}' -e 's/\(myword.*\)//' -e :a inputfile 

您的輸入,產生:

bla bla bla, 
ble ble ble 
blo blo blo, 
+0

@devnull ==>是的!這就是答案。非常感謝 ! @ Rahul ==>我試過你的解決方案,但它沒有工作:( – toch

+3

如果你在sd中使用s,g和p以外的任何東西(帶-n),那麼你要麼使用了錯誤的工具,要麼有一個更簡單的sed解決方案,所有其他的sed語言結構在20世紀70年代中期awk被髮明時變得過時了 –

2

剛剛擺脫一切從「myWord」的最多一個逗號或行尾:

$ sed 's/\(.*\) myword[^,]*/\1/' file 
word1 word2, 
lorem ipsum dolor amet 
salut comment ca va, 
+2

+1完全贊同你對'sed'的想法,使用分支和緩衝區只會導致混淆和不可維護的代碼。我非常喜歡偶爾的挑戰來解決'sed'中的一個複雜問題,但是除了替換之外,它絕不是我的首選工具。 –

0

這可能爲你工作(GNU SED):

sed 's/ myword[^,]*//' file 

從第一空間刪除myword之前到第一以下,或行結束,或:

sed 's/ myword.*\([^,]\|\(,\)\)$/\2/' file 

從第一空間刪除myword前行的末尾或行的末尾之前的,