2016-11-13 105 views
0

不知道爲什麼我的RedGex表達不工作,我想ommit匹配和下一行SED刪除匹配和下一行

[example.com] 
10.0.0.1 
10.0.0.2 
[example.net] 
10.0.0.10 
10.0.0.20 

所需的輸出

[example.net] 
10.0.0.10 
10.0.0.20 

這是我曾嘗試到目前爲止,但它匹配比想望更多的線

sed -e '/(\[example.com\])(.*\n)+/d' 
+0

的行數相匹配後刪除'[例如.com]'固定或可變? – Sundeep

+0

行數是可變的:) – Deano

+0

所以,你想從行匹配中刪除'[example.com]'但不包括匹配下一行'[example。*]'? – Sundeep

回答

1

sed是針對個別行的簡單替代,就是這樣。爲別的,你應該用awk對於軟件的每個所需的特性(效率,透明度,穩健性,可移植性,可維護性等,等):

$ awk '/^\[/{f=/\[example\.com\]/} f' file 
[example.com] 
10.0.0.1 
10.0.0.2 

$ awk '/^\[/{f=/\[example\.com\]/} !f' file 
[example.net] 
10.0.0.10 
10.0.0.20 
+1

謝謝埃德,非常清楚! – Deano

2

我認爲awk更適合於此任務

$ awk '/\[example.com\]/{f=1; next} /\[example.*\]/{f=0} !f' ip.txt 
[example.net] 
10.0.0.10 
10.0.0.20 
  • /\[example.com\]/{f=1; next}如果線匹配[example.com]設置一個標誌f並移動到下一行
  • /\[example.*\]/{f=0}如果線匹配\[example.*\],未設置該標誌
  • !f打印行,如果標誌沒有被設置


使用sed,b美國東部時間我可以使用此answer

$ sed '/\[example.com\]/,/\[example.*\]/ { /\[example.com\]/d; /\[example.*\]/!d }' ip.txt 
[example.net] 
10.0.0.10 
10.0.0.20 
+1

我從你的例子中學到了很多東西,非常感謝! – Deano

1

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

sed -n '/^\[[^]*\]/h;G;/\n\[example.com\]/!P;d' file 

在遇到一個線(S)你不要想匹配,店內說行在保持空間(HS)中,將其附加到圖案空間(PS),並且如果第二部分不包含所需的字符串,則只打印當前行。