利用sed逃逸&;人物

利用sed逃逸&;人物,sed,Sed,我试图使用gnu sed 4.7来转义两种文本模式之间的所有&字符。这件事怎么办 我的目标是: 之前: some&words& things& stuff###&this & area&is&what&should&change###more&text 之后: some&words& things& stuff###\&this \& area\&is\&wh

我试图使用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服务器上,gnu sed 4.7从bash终端启动

sed -i -e "s/\(###\)\(.*\)\&\(.*\)\(###\)/\1\2\\\&\3\4/g" file.txt

上面的一行没有转义任何
&
字符。

使用perl非常简单:

perl -i -pE 's{(###.*?###)}{$1 =~ s/&/\\&/gr}eg' file.txt

我们使用嵌套替换。第一个模式只是获取
###
分隔符之间的所有块,然后通过对捕获的字符串运行另一个替换来计算替换,并转义所有
&
字符。

这让我觉得是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
gawk-i in place'
开始{FS=OFS=“####”}

{for(i=2;我想你也可以用Perl解决方案吗?我也不知道如何用纯正则表达式来实现这一点。如果你用#####分割字符串,用一个简单的正则表达式处理中间部分,然后用####再次连接以得到你想要的结果,这很容易。如果你不坚持sed,用Perl很容易……我希望允许t他的代码只能用标准Linux安装中的基本包执行。但是如果没有其他方法,Perl解决方案肯定比什么都没有好。没有“标准Linux安装”这样的东西还有,什么Linux发行版不打包perl?只有在每行只有一对
#########
的情况下,这才有效。非常感谢!我真的需要花时间了解perl.:-)