在正则表达式中使用变量

Using a variable in a regular expression

我正在使用一些 sub(), gsub() 函数来替换存储在变量中的内容。

比如说:

$ awk 'BEGIN {str="hello bee"; patt="llo"; gsub(patt,"XX",str); print str}'
heXX bee

这会将 str 中包含的字符串中所有出现的 llo 替换为 XX。不错

现在说我想使用一个更复杂的正则表达式,它同时使用变量和模式。例如,"he" + 变量 patt。我该怎么做?

如果我尝试使用 gsub(/he/patt, ...) 它不起作用:

awk 'BEGIN {str="hello bee"; patt="llo"; gsub(/he/patt,"XX",str); print str}'

Returns

hello bee

而不是

XX bee

这会起作用

awk 'BEGIN {str="hello bee"; patt="llo"; gsub(patt,"XX",str); print str}'
heXX bee

本质上,您必须将整个模式定义为一个变量,而不是它的一部分。

你可以这样做:

awk 'BEGIN {str="hello bee"; patt="llo"; gsub("he" patt,"XX",str); print str}'
XX bee

/he/patt 不会将字符串连接在一起,但 "he" patt 会。

那时您需要字符串连接,因此必须使用字符串定界符而不是正则表达式的正则表达式定界符:

$ awk 'BEGIN {str="hello bee"; patt="llo"; gsub("he"patt,"XX",str); print str}'
XX bee

请注意,您随后需要将所有转义字符加倍,因为 awk 必须先将字符串转换为正则表达式,这样会用完其中一个转义字符。