2015-08-19 62 views
2

以下命令刪除模式將從所有行13,14,15去除圖案...... 29包含它:SED:從兩個具體線路

sed -i 13,29s/PATTERN// file 

不過,我想僅從刪除PATTERN 13日和29日線。很明顯,我可以使用

sed -i 13s/PATTERN//;29s/PATTERN// file 

但我的模式足夠長,使這個不方便,所以我想只指定PATTERN一次。有任何想法嗎?我試圖尋找答案,但什麼也沒找到。

此外,是否有一個合理的原因,爲什麼sed使用逗號而不是短劃線來匹配一系列的行?我覺得這不合邏輯。

在此先感謝。

+1

將你的模式存儲在一個變量,並重復變量? – HuStmpHrrr

+0

太複雜。我正在尋找更方便的東西。 – mYself

+1

好吧,我打電話也很方便...替代方案是awk。 'NR == 13 || NR == 29'非常方便 – HuStmpHrrr

回答

0

OK,下面可能是最接近的東西怎麼可能是回答我的問題:

sed -i '13,29{14,28!s/PATTERN//}' file 

與邏輯或再長一點的回答:

sed -i '13bA;29bA;b;:A;s/PATTERN//' file 

此外,使用一個變量:

VAR=PATTERN 
sed -i "13s/$VAR//;29s/$VAR//" file 

由於@Jeff鮑曼for redirection,和@HuS tmpHrrr用於使用變量的建議。

2

用awk:

awk 'NR == 13 || NR == 29 { sub(/PATTERN/, "") } { print }' file 
當然

,你要在這裏用awk兼容重。 https://www.gnu.org/software/gawk/manual/html_node/Regexp.html#Regexp

第一部分達到您的要求,第二部分只是將所有內容打印出來。您可以使用重定向將其他文件放入另一個文件,然後移至原始位置。

+0

正如您所說,這隻會打印出PATTERN已刪除的指定行。由於我的輸入是一個文件,因此該命令應該寫入以反映該文件。另外,它比使用sed更復雜。 – mYself

+0

@自己沒有。它應該打印出13和29行修改的文件的所有內容。並傳遞到文件中就像展示一樣簡單。你在尋找什麼樣的解決方案? – HuStmpHrrr

+0

也許你試過我的舊回答。現在在你的瀏覽器上試試這個。或先刷新以確保它。 – HuStmpHrrr