我想使用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并仅删除该特定主机条目。
答案 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的一种解决方案。
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
命令保存修改后的文件。