Sed脚本匹配包含字符串但不包含其他字符串的行

时间:2017-02-16 21:38:06

标签: regex sed

我正在尝试编写一个sed脚本来替换一行的一部分,但仅限于没有“$”符号的行。

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

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

我想用“host = zzzzz”替换“host = abc”和“host = def”,并忽略“host = $ myvar”。所以最终输出应该如下:

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

我尝试了一些正则表达式,但它们没有用。

3 个答案:

答案 0 :(得分:1)

这是使用模式地址的一种方式:

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

结果:

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

答案 1 :(得分:0)

使用此正则表达式:

^host=([^\$].*?)$
  • 对于此示例,您需要使用多行标记/m或逐行浏览。它使用^$来表示行的开头/结尾
  • [^\$]要求的字符与$
  • 不同

以下是一个实例:https://regex101.com/r/8w6er9/2

如果你不能逐行浏览,你也可以使用这个正则表达式:

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

答案 2 :(得分:0)

您可以使用此16命令:

sed

sed -E 's/^(host=)[^$]+$/\1zzzzz/' file host=$myvar param1=val1 param2=val2 host=zzzzz host=zzzzz 是一个否定的字符类,匹配任何不是[^$]+的字符中的一个或多个