2013-04-23 83 views
2

我有一個awk和sed的例子。兩者似乎都使用相同的正則表達式,但輸出不同。所以模式擴展必須有所不同。但我無法區別。誰能解釋一下?sed和awk正則表達式有什麼區別

$ echo "THE BEAR ATE THE FISH" |sed -e 's/[^ ]*(H|F)[^ ]*/<red>&/g' 
THE BEAR ATE THE FISH 
$ echo "THE BEAR ATE THE FISH" | awk 'gsub(/[^ ]*(H|F)[^ ]*/,"<red>&")' 
<red>THE BEAR ATE <red>THE <red>FISH 
$ sed --version 
GNU sed version 4.1.5 
$ awk --version 
GNU Awk 3.1.5 
+0

似乎在sed中,而不是'(H | F)','[HF]'確實給出相同的輸出。 – abasu 2013-04-23 12:56:21

回答

7

您正在使用交替|在你的正則表達式是擴展的正則表達式類的一部分。所不同的是sed(和grep你需要明確的,當你想通過GNU sed-r標誌使用擴展的正則表達式和-EGNU grep

$ echo "THE BEAR ATE THE FISH" | sed -re 's/[^ ]*(H|F)[^ ]*/<red>&/g' 
<red>THE BEAR ATE <red>THE <red>FISH 

或者你可以逃脫擴展正則表達式特點:

$ echo "THE BEAR ATE THE FISH" |sed -e 's/[^ ]*\(H\|F\)[^ ]*/<red>&/g' 
<red>THE BEAR ATE <red>THE <red>FISH 

更重要的是,你可以使用一個字符類在這裏:

$ echo "THE BEAR ATE THE FISH" |sed 's/[^ ]*[HF][^ ]*/<red>&/g' 
<red>THE BEAR ATE <red>THE <red>FISH 

所有三個工具的手冊頁都有解釋在那裏使用正則表達式的章節。