【问题标题】:using sed to escape & characters使用 sed 转义 & 字符
【发布时间】:2019-06-07 08:52:18
【问题描述】:

我正在尝试使用 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

以上行没有转义任何& 字符。

【问题讨论】:

  • 您也可以使用 Perl 解决方案吗?
  • 我也不知道如何使用纯正则表达式来做到这一点。如果你用###分割字符串,用一个简单的正则表达式处理中间部分,然后用###再次加入,得到你想要的结果,这很容易。至少如果你不坚持 sed 的话,使用 Perl 很容易......
  • 我希望允许仅使用标准 Linux 安装中的基本包执行此代码。但如果没有其他办法,Perl 解决方案肯定比没有好。
  • 没有所谓的“标准 Linux 安装”。另外,哪个 Linux 发行版不打包 perl?

标签: sed


【解决方案1】:

使用 perl 非常简单:

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

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

【讨论】:

  • 非常感谢!我真的需要花时间去了解 Perl。 :-)
【解决方案2】:

这让我觉得是 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

【讨论】:

  • 只有在每行恰好有一对 ###...### 时才有效。
猜你喜欢
  • 1970-01-01
  • 2012-07-03
  • 2014-06-14
  • 2015-01-17
  • 2011-01-05
  • 2015-01-22
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
相关资源
最近更新 更多