2017-02-16 99 views
1

我想写一个sed脚本来替换一部分行,但只在行中没有“$”符号。Sed脚本匹配包含一个字符串,但不包含另一个字符串的行

例如,该文件可能看起来像

host=$myvar 
param1=val1 
param2=val2 
host=abc 
host=def 

我要替换“主机= ABC”和“主机=高清”与“主机= ZZZZZ”而忽略了“主机= $ MYVAR” 。所以最终的输出应该是这样的:

host=$myvar 
param1=val1 
param2=val2 
host=zzzzz 
host=zzzzz 

我试了几个正则表达式,但他们没有工作。

回答

1

下面是一个使用模式地址的一种方法:

sed '/\$/!s/^\(host=\).*/\1zzzz/' file 

结果:

host=$myvar 
param1=val1 
param2=val2 
host=zzzz 
host=zzzz 
+0

为什么在2个操作中,当单个替换可以通过使用'^ \(host = \)[^ $] *'来处理它时(请参阅下面的答案) – anubhava

0

使用正则表达式:

^host=([^\$].*?)$ 
  • 在这个例子中,你需要使用多标志/m或逐行通过它去。它采用^$指示线
  • [^\$]的开始/结束需要一个字符比一个$

这里不同的是一个活生生的例子:https://regex101.com/r/8w6er9/2


如果你不能你也可以使用这个正则表达式:

(?:^|\r?\n)host=([^\$].*?)(?:\r?\n|$) 
0

可以为此使用sed命令:

sed -E 's/^(host=)[^$]+$/\1zzzzz/' file 

host=$myvar 
param1=val1 
param2=val2 
host=zzzzz 
host=zzzzz 

[^$]+是否定的字符类匹配1个或多个不属于任何字符的$

相关问题