在awk中实现带转义符的split分割:忽略?后的+
在awk中实现带转义的"+"字符分割需求
需求核心:按"+"分割字段,但遇到"?+"时不分割,同时移除转义符"?",将"?+"还原为"+"。
问题场景
给定示例字符串:
exampleString="Var1, Var2Pt1+Var2Pt2+Var2Pt?+3+Var2Pt4, Var3"
当前代码直接用"+"作为分隔符,导致错误分割"?+"部分,输出为:
Var2Pt1, Var2Pt2, Var2Pt?, 3, Var2Pt4,
期望输出:
Var2Pt1, Var2Pt2, Var2Pt+3, Var2Pt4,
解决方案
方法1:临时字符替换法(兼容所有awk版本)
这种方法通过临时替换转义后的"+",避免split误分割,兼容性强,适合所有awk环境:
awkOutput=$(awk ' BEGIN{ FS="," temp = "\x01" # 使用ASCII控制字符作为临时标记,避免与业务字符冲突 } { # 先将"?+"替换为临时字符 modified = $2 gsub(/\?\+/, temp, modified) # 按"+"分割处理后的字符串 n = split(modified, subfields, /\+/) # 遍历字段,还原临时字符并输出 for (i=1; i<=n; i++) { gsub(temp, "+", subfields[i]) printf "%s, ", subfields[i] } print "" }' <<<"$exampleString") echo "$awkOutput"
方法2:负向零宽断言法(仅GNU awk支持)
如果你的脚本仅运行在GNU awk(gawk)环境下,可以利用正则负向零宽断言直接匹配需要分割的"+":
awkOutput=$(awk ' BEGIN{FS=","} { # 匹配前面没有"?"的"+"作为分隔符 n = split($2, subfields, /(?<!\?)\+/) # 移除字段中的转义符"?" for (i=1; i<=n; i++) { gsub(/\?/, "", subfields[i]) printf "%s, ", subfields[i] } print "" }' <<<"$exampleString") echo "$awkOutput"
输出验证
两种方法均会输出符合预期的结果:
Var2Pt1, Var2Pt2, Var2Pt+3, Var2Pt4,
内容的提问来源于stack exchange,提问作者paul frith
相关产品推荐
相关产品推荐

