对 awk 中匹配文本的反向引用

对 awk 中匹配文本的反向引用

我需要从 awk (GNU Awk 4.2.0) 输入中转义一些字符 - {with \{[with\[|with \|。我通过三个gsub电话实现了这一点:

for (i = 2; i <= NF; i++) {
    gsub(/{/, "\\{", $i)
    gsub(/\[/, "\\[", $i)
    gsub(/\|/, "\\|", $i)
}

如何将这三个调用合并为一个?就像是

gsub(/([{[|])/, "\\\1", $i)

答案1

可以&在替换中使用来引用匹配的文本:

$ awk '{gsub(/[[{|]/, "\\\\&", $0); print}' <<<"abc { | [ def"
abc \{ \| \[ def

这只是一个常规[...]字符类,在模式中包含[, |, 和,以及一个充分转义的反斜杠,后跟替换。你确实需要所有这些。{&


对于更复杂的图案gawk有一个gensub功能它允许您引用部分文本,例如\\1,但这里不需要。所有 POSIX 兼容的awk都支持&在替换中包含整个匹配子字符串的行为。

答案2

OP 可能想防止$1这些,所以也许:

echo; 
( 
  mawk '{ gsub(/[[{|]/, "\\\\&", $0); print}'    <<<"a[b{c { | [ def";

  mawk '$(((__=$!_)gsub("[[{|]","\\\\&"))~_)=__' <<<"a[b{c { | [ def" \

) | gcat -n | lgp3 


 1  a\[b\{c \{ \| \[ def

 2  a[b{c \{ \| \[ def

因此,不必循环 中$2 to $NF的所有内容,只需保存 的原始副本$1,处理gsub()整行,然后将其放回原处,

将原始副本放回第一个字段的额外好处$1就像已经完成一样$1=$1,确保无论是否进行任何替代都将打印该行。

相关内容