我正在尝试使用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
这是在Linux服务器上,从bash终端启动gnu sed 4.7。
sed -i -e "s/\(###\)\(.*\)\&\(.*\)\(###\)/\1\2\\\&\3\4/g" file.txt
上面的代码行没有转义任何&
字符。
发布于 2019-06-07 08:29:19
使用perl很容易:
perl -i -pE 's{(###.*?###)}{$1 =~ s/&/\\&/gr}eg' file.txt
我们使用嵌套替换。第一个模式只是获取###
分隔符之间的所有块,然后通过在捕获的字符串上运行另一个替换来计算替换,转义所有&
字符。
发布于 2019-06-07 08:43:45
这让我觉得这是awk的工作:
awk 'BEGIN {FS = OFS = "###"} {gsub(/&/,"\\\\&",$2)} 1' file
或者将文件保存在原地,就像sed -i
一样:
gawk -i inplace 'BEGIN {FS = OFS = "###"} {gsub(/&/,"\\\\&",$2)} 1' file
为了处理@melpomene的有效注释,awk程序变得有点冗长:
gawk -i inplace '
BEGIN {FS = OFS = "###"}
{for (i=2; i<NF; i+=2) { gsub(/&/,"\\\\&",$i) }}
1
' file
https://stackoverflow.com/questions/56486455
复制相似问题