我需要从 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
,确保无论是否进行任何替代都将打印该行。