SED 仅更改行首并保留行尾

Pau*_*ker 2 sed regular-expression

基本上我有一种情况,我经常需要修改我的主机文件以访问我工作场所的不同服务器。试图自动化该过程。我一直在尝试使用sed来进行我需要的更改。基本上,我试图为某些 IP 保留整行并注释掉其他 IP。

对于以10.4.To uncomment via开头的 IP sed,我已经尝试过

sed -i '/#10\.4\..*/c\10\.4\..*' /etc/hosts
Run Code Online (Sandbox Code Playgroud)

它替换了所有匹配的行,10.4..*而不是保留整行。我也尝试过使用组/匹配:

sed -i '/#10\.4\.(.*)/c\10\.4\.\1' /etc/hosts
Run Code Online (Sandbox Code Playgroud)

但这只是默默地失败,根本没有做任何改变。

我究竟做错了什么?

ter*_*don 5

要从 IP 开头的行中删除注释10.4(这将删除第一个#,我假设您永远不会有更多):

sed -i '/^#10\.4/{s/^#//}' /etc/hosts
Run Code Online (Sandbox Code Playgroud)

要向这些行添加注释:

sed -i '/^10\.4/{s/^/#/}' /etc/hosts
Run Code Online (Sandbox Code Playgroud)

那么,为什么你的失败了?您正在使用c\这意味着:

c\
文本

删除与地址或地址范围匹配的行,并输出该命令后面的文本行(除了最后一个以 \ 结尾的每一行,从输出中删除)代替最后一行(或代替每个行(如果未指定地址)。执行此命令后将开始新的循环,因为模式空间将被删除。

所以,当你运行时sed -i '/#10\.4\..*/c\10\.4\..*' /etc/hosts,这意味着“#10\.4\..*用文字字符串替换#10\.4\..*”。你想做的是:

sed -i 's/#10\.4\.\(.*\)/10.4.\1/' /etc/hosts`
Run Code Online (Sandbox Code Playgroud)

上面使用替换运算符 ( s/from/to/) 和模式捕获,第一个模式\( \)可以称为\1,第二个模式\2等。正如您从迈克尔的回答中看到的那样,这也不需要,您可以替换#10.410.4。或者,正如我上面的回答,您可以简单地#单独删除。