来自 awk 编程语言
在匹配表达式中,带引号的字符串 like
"^[0-9]+$"
通常可以与斜杠括起来的正则表达式互换使用,例如/^[0-9]+$/
.不过,有一个例外。如果引号中的字符串要匹配正则表达式元字符的文字出现,则需要一个额外的反斜杠来保护保护反斜杠本身。那是,$0 ~ /(\+|-)[0-9]+/
和
$0 ~ "(\\+|-)[0-9]+"
是等价的。
这种行为可能看起来很神秘,但它的出现是因为 awk 解析带引号的字符串时删除了一层保护反斜杠。如果元字符前面需要一个反斜杠来关闭其在正则表达式中的特殊含义,那么该反斜杠需要前面有一个反斜杠来在字符串中保护它。
如果匹配运算符的右操作数是变量或字段变量,如
X ~ $1
那么第一个字段中不需要额外的反斜杠,因为反斜杠在数据中没有特殊含义。
最后一句是什么意思?
为什么“第一个字段不需要额外的反斜杠,因为反斜杠在数据中没有特殊含义”?
谢谢。
答案1
其含义是数据相对于常量,在 awk 程序中出现的"abc"
or 或88
是常量,但 awk 变量包含数据,或包含从输入读取的数据。数据不会被解析,但 awk 程序文本主体中的常量会被解析。/a|b/
$0
x+y...z
假设您想要匹配有 1 个或多个 的输入y
,因此您需要一个正则表达式,但需要转义,否则+
它只意味着 1 个或多个x
。因此您可以使用以下任意一种:
awk 'BEGIN{ a = "x\\+y+z"; print a }
NR==1{ b = $0; print b; next }
$0 ~ a {print "match a " $0 }
$0 ~ b {print "match b " $0 }
$0 ~ /x\+y+z/ {print "match 2 " $0 }
$0 ~ "x\\+y+z" {print "match 3 " $0 }
' <<\!
x\+y+z
x+yyyyz
!
最后四行都打印出它们匹配相同的内容,例如x+yyyyz
.表示print a
变量a
的数据值是x\+y+z
常量解析后的,与从输入数据的第一行读取未解析的print b
变量b
的数据值是相同的,最终的正则表达式常量和字符串常量是等效的形式。