sed和awk正则表达式有什么区别

时间:2013-04-23 12:50:57

标签: regex bash sed awk

我有一个awk和一个sed示例。两者似乎都使用相同的正则表达式,但输出不同。因此,模式扩展必须变得不同。但我无法得到差异。谁能解释一下?

 $ 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

1 个答案:

答案 0 :(得分:7)

您在regexp中使用了交替|,这是扩展的regexp类的一部分。不同之处在于sed (和grep,当您想要使用-r标志GNU sed时,需要使用扩展正则表达式时需要显式} -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

所有三个工具的手册页都有解释与正则表达式一起使用的部分。