2014-01-27 53 views
1

輸入:正則表達式有另一個詞的字不包括線

hello world. 
This is hello world. 
Another hello world. 
New hello world. 

現在搜索的含有hello不含線所有出現This

搜索輸出:

hello world 
Another hello world 
New hello world. 

現在全部更換那些hellohell

更換輸出:

hell world. 
This is hello world. 
Another hell world. 
New hell world. 
+0

我不認爲的grep可以做更換...... – nhahtdh

回答

2

您可以使用awk做到這一點

awk '/hello/ && !/This/ {gsub(/hello/,"hell")}8' file 
hell world. 
This is hello world. 
Another hell world. 
New hell world. 
+0

@nhahtdh這只是一個錯字,無需10秒後給予否定。 – Jotne

+0

我會這樣做的一個錯誤的答案。只要它被糾正,我會刪除我的downvote。 (好吧,你現在的低估不是我的)。順便說一句,這隻適用於nawk和gawk,據我可以從http://www.grymoire.com/unix/Awk.html#uh-40 – nhahtdh

+0

@nhahtdh看到謝謝,但請等待幾秒鐘,然後再下來投票:)這應該與幾乎所有'awk''gsub'是一個標準功能。 'sub'也可以使用,但只會在每一行代替一個'hello'。 – Jotne

1

grep不做更換,所以你需要使用不同的工具。 Jotne展示瞭如何用awk做到這一點,這裏是如何與sed做到這一點:

sed -e '/This/b' -e '/hello/ s/hello/hell/' file 

輸出:

hell world. 
This is hello world. 
Another hell world. 
New hell world. 
1
perl -pi -e 's/hello/hell/g if(/hello/ && $_!~/This/)' your_file 

更簡單的版本:

perl -pi -e 's/hello/hell/g unless(/This/)' your_file 

測試下圖:

> cat temp 
hello world. 
This is hello world. 
Another hello world. 
New hello world. 
> perl -pe 's/hello/hell/g unless(/This/)' temp 
hell world. 
This is hello world. 
Another hell world. 
New hell world. 
> 
1

爲什麼不簡單地做到這一點:

sed '/This/!s/hello/hell/g' 

或我誤解了要求?它提供了:

hell world. 
This is hello world. 
Another hell world. 
New hell world. 
+0

可能很有趣,回聲「helloo work」:-)。你的sed對於這個請求是最有效的 – NeronLeVelu

相關問題