我正在尝试使用gnu sed 4.7来转义两种文本模式之间的所有&
字符。怎么会这样呢?
这是我的目标:
之前:
some&words& things& stuff###&this & area&is&what&should&change###more&text
之后:
some&words& things& stuff###\&this \& area\&is\&what\&should\&change###more&text
这是在从bash终端启动gnu sed 4.7的Linux服务器上。
sed -i -e "s/\(###\)\(.*\)\&\(.*\)\(###\)/\1\2\\\&\3\4/g" file.txt
上面的行不能转义任何&
个字符。
答案 0 :(得分:2)
使用perl非常简单:
perl -i -pE 's{(###.*?###)}{$1 =~ s/&/\\&/gr}eg' file.txt
我们使用嵌套替换。第一个模式仅捕获###
分隔符之间的所有块,然后通过对捕获的字符串运行另一个替换来转义所有&
字符,从而计算替换。
答案 1 :(得分:1)
这使我成为awk的工作:
UIViewController
或者像awk 'BEGIN {FS = OFS = "###"} {gsub(/&/,"\\\\&",$2)} 1' file
一样将文件保存到位:
sed -i
要解决@melpomene的有效评论,awk程序会有些罗word:
gawk -i inplace 'BEGIN {FS = OFS = "###"} {gsub(/&/,"\\\\&",$2)} 1' file