Awk中使用sub函数时如何转义|实现含竖线的字符串替换
替换带竖线字符串失效的解决方案
失效原因
你使用的sub()函数第一个参数默认按正则表达式解析,而|是正则语法里表示“或”逻辑的特殊元字符,不是字面的竖线分隔符。原写法中的"|Test|123"会被正则拆成「匹配空值、匹配Test、匹配空值、匹配123」的多分支逻辑,根本不会匹配连续的|Test|123字符串,替换逻辑自然完全失效。
具体解决方法
方法1:转义竖线做正则字面匹配
只要把正则中的特殊字符|加反斜杠转义,让正则识别它是普通的竖线字符即可。使用awk原生的正则字面量写法(用/ /包裹匹配内容)不需要额外处理字符串转义,写法最简洁:
{sub(/\|Test\|123/, "|Essai|666");} {print;}
方法2:按分隔字段定向替换(无特殊字符干扰,长期使用更省心)
你的输入本身就是以|为分隔符的结构化数据,直接按字段判断替换,完全绕开正则特殊字符的影响,哪怕后续替换的内容里有其他正则特殊符号也不会出错:
# 设定输入、输出的分隔符均为| BEGIN { FS = "|"; OFS = "|" } # 匹配第2字段为Test、第3字段为123的行,替换对应字段值 $2 == "Test" && $3 == "123" { $2 = "Essai"; $3 = "666" } {print}
运行效果
两种方法运行后都会得到预期的输出结果:
13|Essai|666|6232 14|Move|126|6692 15|Essai|666|6152
内容的提问来源于stack exchange,提问作者Abou Ilyès
相关产品推荐
相关产品推荐

