~ /pattern/ 和 ~ "pattern" 之间的区别?

Niz*_*ziL 2 regex awk

所以,问题很简单:在 awk 中,if ( var ~ /pattern/ )if ( var ~ "pattern" )?

我已经对 csv 进行了一些基本测试,两者似乎都产生了相同的结果......我错过了任何细微的差异吗?

Ini*_*ian 6

这在 GNU awkdocs under 3.6 Using Dynamic Regexps 中有很好的解释

NOTE: 使用~and!~运算符时,请注意斜杠中的正则表达式常量和双引号中的字符串常量之间存在差异。如果您打算使用字符串常量,您必须了解字符串本质上被扫描了两次:第一次是在awk读取您的程序时,第二次是在它匹配程序左侧的字符串时运算符与右侧的模式。

如果字符串被扫描两次有什么区别?答案与转义序列有关,尤其是与反斜杠有关。要将反斜杠转换为字符串中的正则表达式,you have to type two backslashes.

一个简单的演示示例来解释差异。使用正则表达式常量时

echo 'foo*bar dude' | awk '$1 ~ /foo\*bar/'
Run Code Online (Sandbox Code Playgroud)

并且使用动态正则表达式字符串,因为下面的正则表达式字符串".."经过两次扫描,您需要额外的\来转义\添加的 for*

echo 'foo*bar dude' | awk '$1 ~ "foo\\*bar"'
Run Code Online (Sandbox Code Playgroud)

使用动态正则表达式时,所有反斜杠转义序列字符都会进行这种特殊处理。例如,\n在行中转义 a

echo 'foo\nbar dude' | awk '$1 ~ /foo\\nbar/'
Run Code Online (Sandbox Code Playgroud)

echo 'foo\nbar dude' | awk '$1 ~ "foo\\\\nbar"'
Run Code Online (Sandbox Code Playgroud)

该文档还清楚地说明了使用哪个

字符串常量写起来更复杂,读起来更难。使用正则表达式常量可以使您的程序不易出错。不了解这两种常量之间的区别是错误的常见来源。

使用正则表达式常量更有效。awk可以注意到您提供了一个正则表达式并将其存储在一种使模式匹配更有效的形式中。使用字符串常量时,awk 必须先将字符串转换成这种内部形式,然后再进行模式匹配。

使用正则表达式常量是更好的形式;它清楚地表明您打算进行正则表达式匹配。

  • 买本书并阅读它还是有话要说的:-)。[有效的 AWK 编程,第四版](http://shop.oreilly.com/product/0636920033820.do)。 (4认同)
  • 我在第 6 章和第 7 章中搜索了这个信息很长时间...我很快就会学习如何阅读目录:P 谢谢! (2认同)
  • 很高兴有帮助。我总是使用“GNU awk 动态正则表达式”之类的关键字,并查看指向官方手册的链接。 (2认同)