所以,问题很简单:在 awk 中,if ( var ~ /pattern/ )
与if ( var ~ "pattern" )
?
我已经对 csv 进行了一些基本测试,两者似乎都产生了相同的结果......我错过了任何细微的差异吗?
这在 GNU awk
docs 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 必须先将字符串转换成这种内部形式,然后再进行模式匹配。使用正则表达式常量是更好的形式;它清楚地表明您打算进行正则表达式匹配。