替换文件内引号内的特殊字符

时间:2016-01-05 17:16:01

标签: regex bash awk sed

在搜索Google,Stackoverflow或任何其他来源时,我没有找到适用于此问题的答案,所以我决定在这里问自己。

在GNU Bash(Ubuntu)中,我试图仅替换名为test.txt的文件中引号之间的特殊字符,该文件具有以下内容

$(document).on('click', 'input[type="checkbox"]', check(handler));

以便生成的内容为

foo_bar "foo_bar"

目前我还没有运气,我已尝试过多种解决方案,例如

foo_bar "foo bar"

否则会很好,但是该命令导致文件内容只是" foo bar"而不是整个文件。我正在寻找一种直接替换文件中引用的特殊字符的方法,sed和awk都可以。

2 个答案:

答案 0 :(得分:3)

使用awk:

awk 'BEGIN{FS=OFS="\""} {for (i=2; i<=NF; i+=2) gsub(/_/, " ", $i)} 1' file
foo_bar "foo bar"

答案 1 :(得分:3)

使用sed:

sed -ri 's/("[^_]*)_([^_]*")/\1 \2/g' test
  • -r启用扩展正则表达式,因此您无需转义()
  • -i将结果替换为输入文件
  • ("[^_]*)匹配"后跟任何 _(重复零次或多次)并捕获匹配
  • ([^_]*")匹配任何 _(重复零次或多次)后跟"并捕获匹配
  • \1\2是对已捕获群组的反向引用
  • g是“全局”修饰符:替换在同一行上尽可能多地重复

这仅适用于格式正确的表达式(偶数引号),并且不处理转义引号。