SED替换匹配线,但如果已注释掉则不会

时间:2017-07-21 12:11:28

标签: linux sed

我的文字包含这样的一行:

DHCPD_INTERFACE="eth4"

还有其他行包含#DHCPD_INTERFACE=

我想替换DHCPD_INTERFACE="eth4"上匹配的整行DHCPD_INTERFACE=,但如果该行包含#

,则不会

我试过了: sed -i.bak '/^#/!s/DHCPD_INTERFACE=/DHCPD_INTERFACE="eth2"/g' dhcpd

但这并不能取代整条生产线。

DHCPD_INTERFACE="eth4"应更新为DHCPD_INTERFACE="eth2",但不得更改包含#DHCPD_INTERFACE=的行。

我该怎么做..? 感谢

3 个答案:

答案 0 :(得分:1)

您可以使用锚点(^)来匹配行的开头:

sed 's/^\(DHCPD_INTERFACE="eth\)4"/\12"/' file

答案 1 :(得分:0)

您可以先用'#'替换这些行,然后用" eth4"替换这些行,最后使用'#&#取回行39;

    sed -i.bak s/#DHCPD_INTERFACE=/foo/g dhcpd
    sed -i s/DHCPD_INTERFACE="eth4"/DHCPD_INTERFACE="eth2"/g dhcpd
    sed -i s/foo/#DHCPD_INTERFACE=/g dhcpd

不是最好的解决方案,但仍然是有效的解决方案。希望我帮忙!

答案 2 :(得分:0)

sed 解决方案:

示例test文件内容:

DHCPD_INTERFACE="eth4"
#DHCPD_INTERFACE="eth4"
sed 's/\([^#]\|^\)DHCPD_INTERFACE="eth4"/\1DHCPD_INTERFACE="eth2"/g' test

输出:

DHCPD_INTERFACE="eth2"
#DHCPD_INTERFACE="eth4"
相关问题