2017-02-16 489 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個或多個不屬於任何字符的$

相關問題