简体   繁体   English

SED替换匹配行,但如果被注释掉则不行

[英]SED Replace Matching Line but not if it's commented out

My text contains a line like this: 我的文字包含这样的一行:

DHCPD_INTERFACE="eth4"

There are other lines containing #DHCPD_INTERFACE= 其他行包含#DHCPD_INTERFACE=

I want to replace the whole line DHCPD_INTERFACE="eth4" matching on DHCPD_INTERFACE= but not if the line contains a # 我想替换与DHCPD_INTERFACE="eth4"匹配的整行DHCPD_INTERFACE="eth4" ,但如果行包含#DHCPD_INTERFACE=希望替换

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

But this doesn't replace the whole line. 但这并不能取代整条生产线。

This DHCPD_INTERFACE="eth4" should be updated to DHCPD_INTERFACE="eth2" but no line containing a # and DHCPD_INTERFACE= should be changed. DHCPD_INTERFACE="eth4"应该更新为DHCPD_INTERFACE="eth2"但不应更改包含#DHCPD_INTERFACE=行。

How can I do this.. ? 我怎样才能做到这一点.. ? Thanks 谢谢

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

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

You can first replace the lines with a '#', then replace the lines with "eth4", and finally get back the ones with the '#'. 您可以先将行替换为“#”,然后将行替换为“ eth4”,最后再将其替换为“#”。

    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

Not the best solution, but still a working one. 不是最佳解决方案,但仍然是可行的解决方案。 Hope I helped ! 希望我有所帮助!

sed solution: sed解决方案:

The exemplary test file contents: 示例性test文件内容:

DHCPD_INTERFACE="eth4"
#DHCPD_INTERFACE="eth4"

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

The output: 输出:

DHCPD_INTERFACE="eth2"
#DHCPD_INTERFACE="eth4"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM