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

aba*_*asu 2 regex bash awk sed

我有一个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
Run Code Online (Sandbox Code Playgroud)

Chr*_*our 7

您正在使用|regexp中的交替,这是扩展的regexp类的一部分.不同之处在于sed (和grep)当你想使用扩展的正则表达式时你需要明确,通过给出-r标志GNU sed-Ewith GNU grep:

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

或者,您可以转义扩展的正则表达式功能:

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

更好的是你可以在这里使用一个字符类:

$ echo "THE BEAR ATE THE FISH" |sed 's/[^ ]*[HF][^ ]*/<red>&/g'
<red>THE BEAR ATE <red>THE <red>FISH
Run Code Online (Sandbox Code Playgroud)

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