2012-07-23 97 views
2

如何編寫一個sed命令來刪除包含任何幾個正則表達式的行?使用sed刪除cruft行

例如,我希望sed從文檔中刪除「/./。::」,「:: 」,「:: foo」和「^^ bar」。

截至目前,當我運行

sed -ir '/ "//.//. ::|:: _|::foo_|^^bar" /d' text.file 

的響應是 「未知命令 '/'」。

這是具有或不具有周圍的正則表達式內的「S的情況下:

sed -ir '/ //.//. ::|:: _|::foo_|^^bar /d' text.file 

另外,如果我刪除轉義(/)前的 '/',如:

sed -ir '/ "/./. ::|:: _|::foo_|^^bar" /d' text.file 

回答

1

您應該使用轉義符號:\
而且也沒有必要引用模式匹配或加下劃線,只需嘗試:

sed -i -r '/\/.\/. ::|:: |::foo|\^\^bar/d' file.txt 

而且,你可能要考慮逃逸.符號。該點可以匹配任何字符。

HTH

+0

'_'是我正在搜索的表達式的一部分。 – 2012-07-23 19:34:14

+0

另外,即使以「2>&1」結尾,運行-ir似乎也不會輸出文本。發送到「> output.txt」也不會產生輸出。 – 2012-07-23 19:43:09

+0

只是運行'sed -r'解決了輸出問題 – 2012-07-23 20:09:36

0
sed '{ 
s/::foo_// 
s/\^\^bar// 
s!/./. ::!! 
s/:: _// 
}' input_file 

要完全刪除包含模式的行:

sed '{ 
/::foo_/d 
/\^\^bar/d 
\!/./. ::!d 
/:: _/d 
}' input_file 
+2

這不會刪除這些行,它只會替換沒有任何的模式。但修復很簡單;將每個#pattern ##'改爲'\#pattern#d'(如果分隔符是正斜槓,則不需要反斜槓;我使用'#'作爲分隔符的佔位符)。 – tripleee 2012-07-23 07:11:55

+0

哦,腳本週圍的大括號是多餘的。 – tripleee 2012-07-23 07:12:38

+0

當我使用或不使用大括號運行時,它會給出一個錯誤:「命令後多餘的字符」。 – 2012-07-23 19:31:02