sed删除匹配和下一行
不确定为什么我的RedGex表达式不起作用,我正在尝试匹配下一行sed删除匹配和下一行,sed,Sed,不确定为什么我的RedGex表达式不起作用,我正在尝试匹配下一行 [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' 我认为awk更适合这个任务 $ awk '/\[example.com\]/{f=1;
[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'
我认为
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
,我所能做的就是使用它
我认为
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
,我所能做的就是使用它
这可能适用于您(GNU-sed):
遇到不想匹配的行时,将所述行存储在保留空间(HS)中,将其附加到图案空间(PS)中,并且仅当第二部分不包含所需字符串时才打印当前行。这可能适用于您(GNU):
遇到不想匹配的行时,将所述行存储在保留空间(HS)中,将其附加到图案空间(PS)中,并且仅当第二部分不包含所需字符串时才打印当前行。sed仅用于单个行的简单替换,仅此而已。对于任何其他方面,您都应该将awk用于软件的每个理想属性(效率、清晰性、健壮性、可移植性、可维护性等):
sed是针对单个线路的简单补贴,仅此而已。对于任何其他方面,您都应该将awk用于软件的每个理想属性(效率、清晰性、健壮性、可移植性、可维护性等):
匹配
[example.com]
后要删除的行数是固定的还是可变的?行数是可变的:)因此,您希望从行匹配[example.com]
中删除到下一行,但不包括下一行匹配[example.*
?您是正确的,[example.com]下面的行应该删除,但是[example.net]Remain是匹配[example.com]
后要删除的行数是固定的还是可变的?行数是可变的:)因此,您希望从行匹配[example.com]
中删除,但不包括下一行匹配[example.]
?您是正确的,[example.com]并且应删除以下行,但是[example.net]应该保留
sed -n '/^\[[^]*\]/h;G;/\n\[example.com\]/!P;d' file
$ 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