【问题标题】:Replace an expression with special characters by another in shell script or sed [duplicate]在shell脚本或sed中用特殊字符替换一个表达式[重复]
【发布时间】:2023-03-22 13:01:01
【问题描述】:

在文件x 中,包含4*4 4*1 4*4 4*0 的行将被文件y 中的4*4 4*1 3*4 1*4 4*0 替换。我正在使用以下代码:

#!/bin/bash
old=`grep "4*4" x`;
new=`grep "4*4" y`;
sed -i "s/${old}/${new}/g" x

但它在x 中根本没有产生任何变化。我是新手,对于这个网站来说,这可能是一个愚蠢的问题,但我无法用多个特殊字符替换这个表达式。

【问题讨论】:

  • *是一个特殊的char,一个量词,你需要转义它,\*
  • 4*4 表示“4 零次或多次后跟4”到grep

标签: bash sed special-characters


【解决方案1】:

欢迎来到 stackOverflow - 一个很棒的开发者平台?
如果你坚持下去,你也会发现它非常有益。 ?

现在回答你的问题。

*sed 的特殊字符,当它包含在匹配模式 中时。更多信息here
因此,我们需要使用\ 对其进行转义。

您可以对变量old 中的每个* 使用类似old=$(echo "${old}" | sed -r 's/[*]/\\*/g') 的内容。

  • echo "${old}" | 将变量 old 的值提供给 sed
  • 让我以扩展形式写sed命令:sed -r's/[*]/\\*/g'
    • -r 因为我们在模式匹配中使用regex
    • [*]regex 也是 要匹配的模式Info
    • \\*替换字符串 - 第一个 \ 正在转义第二个 \ 并且 * 被视为普通字符。
  • $( ) 已用于将最终输出分配给变量 old


这是修改后的脚本

#!/bin/bash

# Read the strings
old=`grep "4*4" x`;
new=`grep "4*4" y`;

# Escape * i.e. add \ before it - As * is a special character for sed
old=$(echo "${old}" | sed -r 's/[*]/\\*/g')

# Replace
sed -i "s/${old}/${new}/g" x

【讨论】:

  • 因为这是 Bash,我们可以使用参数替换:${old//\*/\\*}。请参阅我的(相关)answer to sed replace with variable with multiple lines
  • @TobySpeight sed 版本对于像我这样的网络 + 移动开发者来说更​​具可读性。我同意 bash 的参数替换总是比任何其他方法都快。您想采取哪种权衡方式?
  • 嗯...致对我的回答投了反对票的人:你能告诉我原因吗?这样我就可以改进它。
猜你喜欢
  • 2013-12-23
  • 1970-01-01
  • 2019-10-14
  • 2021-03-06
  • 2018-01-14
  • 2019-05-12
  • 2019-09-07
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多