不同工具的正则表达式语法之间有什么区别?

时间:2014-03-18 22:01:28

标签: regex sed awk grep gnu

不同工具以不同方式实现正则表达式。例如,匹配“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'

这些差异记录在哪里?

2 个答案:

答案 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扩展:

\+

如果与这些实用程序的其他版本一起使用,这可能无效。