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)
但这只是默默地失败,根本没有做任何改变。
我究竟做错了什么?
要从 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.4
为10.4
。或者,正如我上面的回答,您可以简单地#
单独删除。