Shell 要从文件中删除第i个匹配模式吗

Shell 要从文件中删除第i个匹配模式吗,shell,unix,sed,vim,Shell,Unix,Sed,Vim,我想使用shell命令从dhcpd.cong文件中删除静态条目。目前我使用sed作为主机名。但同一主机名有多个静态条目。以下是示例dhcpd.conf文件中的部分: host my-system4 { hardware ethernet 11:22:33:44:55:66; fixed-address 192.168.17.54; } host my-system4 { hardware ethernet 22:33:44:55:66:77; fixed-address 192

我想使用shell命令从dhcpd.cong文件中删除静态条目。目前我使用sed作为主机名。但同一主机名有多个静态条目。以下是示例dhcpd.conf文件中的部分:

host my-system4 {
  hardware ethernet 11:22:33:44:55:66;
  fixed-address 192.168.17.54;
}

host my-system4 {
  hardware ethernet 22:33:44:55:66:77;
  fixed-address 192.168.17.34;
}
在这里,我使用:

sed -i '/host my-system4/,/^\}/d' xyz.txt
但此命令正在从文件中删除所有主机my-system4条目。如何通过对固定地址执行grep来删除特定条目。此外,主机my-system4下的行数也可能有所不同。我需要一个shell命令,它在固定地址上执行grep并只删除特定的主机条目。

您可以说:

sed -e :a -e '/host my-system4/,/}/ { /}/!{ $!{N;ba};};/pattern/d;}' filename
删除包含指定模式的条目

比如说,

sed -e :a -e '/host my-system4/,/}/ { /}/!{ $!{N;ba};};/192\.168\.17\.34/d;}' filename
将删除包含固定地址的条目
192.168.17.34
。请注意,
已转义,以便与文本
匹配


如果文件中的条目保证用一个空行分隔,您可以简化为:

sed -e '/./{H;$!d;}' -e 'x;/pattern/d' filename
其中,上面命令中的模式表示要删除的条目


添加用于就地编辑的
-i
选项:

sed -i -e :a -e '/host my-system4/,/}/ { /}/!{ $!{N;ba};};/192\.168\.17\.34/d;}' filename

一个解决方案是使用


它创建文件的备份,并将
~
附加到名称后面。如果您想冒丢失数据的风险,请删除
set backup
和管道。它使用全局替换来搜索行
固定地址192.168.17.34
,并选择整个段落将其删除。最后一个
x
命令保存修改后的文件。

谢谢devnull。这对我有用。但是,如果我想使用-i选项对文件本身进行更改,我应该如何使用它?明白了!!!它将像:sed-i:a/主机my-system4/,/}/{/}/!{$!{N;ba};}/192\.168\.17\.34/d;}'tmp.txt
sed -i -e '/./{H;$!d;}' -e 'x;/pattern/d' filename
vim -u NONE -N \
    -c 'set backup | g/\vfixed-address\s+192\.168\.17\.34/ normal dap' \
    -c 'x' infile