sed删除匹配和下一行

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;

不确定为什么我的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; 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