2016-11-13 108 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),并且如果第二部分不包含所需的字符串,则只打印当前行。