如何使用awk或sed匹配替换日志中\'双字符组合为单引号
解决方案
错误原因分析
- 第一个awk命令报错:你在bash单引号包裹的awk脚本内直接使用了
',bash会将其识别为单引号闭合标记,提前截断脚本内容,触发语法错误。 - 第二个sed命令报错:你用单引号包裹了sed表达式,单引号内的
$()命令替换不会被bash执行,sed直接把$(echo...)内容当成正则表达式解析,识别到不合法的反向引用语法就抛出错误。
可用实现方案
两种方案都兼容GNU标准工具,同时覆盖你原有\t转t、\'转'的需求,无需多余管道:
方案1:使用sed实现
sed -e 's/\\t/t/g' -e 's/\o134\o047/\o047/g' F1.log > F2.log
说明:用八进制转义符表示特殊字符规避引号冲突,\o134对应反斜杠\,\o047对应单引号',正则匹配两个连续字符后替换为单个单引号。
方案2:使用awk实现
awk '{gsub(/\\t/,"t"); gsub(/\134\047/, "\047")}1' F1.log > F2.log
说明:同样使用八进制转义符避免bash引号解析问题,两个替换逻辑合并在同一个awk进程内完成,执行效率更高。
内容的提问来源于stack exchange,提问作者Joseph Wulf
相关产品推荐
相关产品推荐

