想从文件中删除匹配模式

时间:2013-12-26 07:46:01

标签: shell unix sed

我想使用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并仅删除该特定主机条目。

2 个答案:

答案 0 :(得分:3)

你可以说:

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

sed -i -e '/./{H;$!d;}' -e 'x;/pattern/d' filename

答案 1 :(得分:1)

使用的一种解决方案。

vim -u NONE -N \
    -c 'set backup | g/\vfixed-address\s+192\.168\.17\.34/ normal dap' \
    -c 'x' infile

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