在搜索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都可以。
答案 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
是“全局”修饰符:替换在同一行上尽可能多地重复这仅适用于格式正确的表达式(偶数引号),并且不处理转义引号。