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

ram*_*ius 5 awk

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

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

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

gsub(/([{[|])/, "\\\1", $i)
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 7

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

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

这只是一个普通的[...]字符类[,|以及{在它的格局,并充分转义反斜线后跟&的更换。你确实需要所有这些。


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