2013-04-23 34 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 

所有三个工具的手册页都有解释在那里使用正则表达式的章节。

相关问题