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)
您正在使用|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)
所有三个工具的手册页都有解释与正则表达式一起使用的部分.