不知道为什么我的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'
不知道为什么我的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'
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
谢谢埃德,非常清楚! – Deano
我认为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
我从你的例子中学到了很多东西,非常感谢! – Deano
这可能为你工作(GNU SED)做:
sed -n '/^\[[^]*\]/h;G;/\n\[example.com\]/!P;d' file
在遇到一个线(S)你不要想匹配,店内说行在保持空间(HS)中,将其附加到图案空间(PS),并且如果第二部分不包含所需的字符串,则只打印当前行。
的行数相匹配后删除'[例如.com]'固定或可变? – Sundeep
行数是可变的:) – Deano
所以,你想从行匹配中删除'[example.com]'但不包括匹配下一行'[example。*]'? – Sundeep