我有一个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
答案 0 :(得分:7)
您在regexp中使用了交替|
,这是扩展的regexp类的一部分。不同之处在于sed
(和grep
),当您想要使用-r
标志GNU sed
时,需要使用扩展正则表达式时需要显式} -E
与GNU 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
所有三个工具的手册页都有解释与正则表达式一起使用的部分。