不同工具以不同方式实现正则表达式。例如,匹配“foo”或“bar”:
printf "%s\n" foo bar baz food | grep -o '\<\(fo\+\|bar\)\>'
printf "%s\n" foo bar baz food | awk '/\<(fo+|bar)\>/'
printf "%s\n" foo bar baz food | sed -n '/\<\(fo\+\|bar\)\>/p'
printf "%s\n" foo bar baz food | sed -nr '/\<(fo+|bar)\>/p'
这些差异记录在哪里?
答案 0 :(得分:13)
分数!我很高兴找到这个页面:
https://www.gnu.org/software/gnulib/manual/html_node/Regular-expression-syntaxes.html
14.8正则表达式语法
Gnulib支持许多不同类型的正则表达式;虽然底层特征相同或相同,但使用的语法各不相同。此处给出的不同类型的描述是自动生成的。
- awk正则表达式语法
- egrep正则表达式语法
- ed正则表达式语法
- emacs正则表达式语法
- gnu-awk正则表达式语法
- grep正则表达式语法
- posix-awk正则表达式语法
- posix-basic正则表达式语法
- posix-egrep正则表达式语法
- posix-extended正则表达式语法
- posix-minimal-basic正则表达式语法
- sed正则表达式语法
答案 1 :(得分:0)
值得注意的是,正则表达式部分的唯一区别是基本正则表达式(BRE)和扩展正则表达式(ERE)之间的差异。
BRE(+ GNU)
printf "%s\n" foo bar baz food | grep '\<\(fo\+\|bar\)\>'
printf "%s\n" foo bar baz food | sed -n '/\<\(fo\+\|bar\)\>/p'
ERE(+ GNU)
printf "%s\n" foo bar baz food | grep -E '\<(fo+|bar)\>'
printf "%s\n" foo bar baz food | sed -nr '/\<(fo+|bar)\>/p'
printf "%s\n" foo bar baz food | awk '/\<(fo+|bar)\>/'
我用上面的grep遗漏了-o
。
值得注意的是,上面的所有示例都是GNU实用程序,其中包含对POSIX正则表达式的GNU扩展。
所有示例都使用GNU扩展:
\< ... \>
此外,BRE示例使用GNU扩展:
\+
如果与这些实用程序的其他版本一起使用,这可能无效。