【问题标题】:Replace a string using sed in Linux在 Linux 中使用 sed 替换字符串
【发布时间】:2016-05-01 17:20:25
【问题描述】:

我想用替换字符串替换后面的原始字符串。

original_str="#22=SI_UNIT(*,*,#5,'','metre');"
replace_str="#22=SI_UNIT(*,*,#5,'','millimetre');"
sed -i "s/$original_str/$replace_str/" ./output/modified.txt

我尝试过以不同的方式使用“sed”。但是,它不起作用。有人知道吗?

概念#22 稍后在同一文件中引用了另一个概念。是这个原因吗?

请注意,在同一个 bash 脚本中的以下字符串可以正常工作:

original_str="#103=CARTESIAN_POINT('P3',0.0,0.0,1.0,#72);"
replace_str="#103=CARTESIAN_POINT('P2',10.0,10.0,10.0,#72);"
sed -i "s/$original_str/$replace_str/" ./output/modified.txt

概念 #103 未在同一文件中的后续概念中使用。

谢谢。

【问题讨论】:

    标签: linux string bash replace sed


    【解决方案1】:

    * 是一个不匹配自身的正则表达式元字符(或只是巧合)。您需要在original_str 中转义它。

    sed -i "s/${original_str//\*/\\*}/$replace_str/" ./output/modified.txt
    

    $(variable//substr/repl} 语法是特定于 Bash 的。在一般情况下,您将需要转义任何正则表达式特殊项——[\.——这在 Bash 中通常很难做到。

    【讨论】:

      【解决方案2】:

      您需要对sed 中具有特殊含义的字符进行转义,在本例中为*

      original_str='#22=SI_UNIT(\*,\*,#5,'','metre');'
      replace_str='#22=SI_UNIT(*,*,#5,'','millimetre');'
      sed -i "s/$original_str/$replace_str/" ./output/modified.txt
      

      这会起作用。

      【讨论】:

      • 是的,你是对的,但我刚刚意识到,你可以逃避#,我觉得这很有趣。
      • 正如我所写,后面的代码(替换)正在工作。我想替换第一个代码。即“米”到“毫米”。此外,我尝试过使用“\”。它不适用于该问题。
      猜你喜欢
      • 2019-08-07
      • 2015-10-25
      • 2016-02-13
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2017-02-08
      • 2015-03-24
      相关资源
      最近更新 更多