【问题标题】:How to replace a text pattern containing brackets?如何替换包含括号的文本模式?
【发布时间】:2012-06-16 05:01:30
【问题描述】:

我想在所有文件中递归地用另一条指令替换包含括号的特定指令。

例如,

mov r1, [r1, r2]

sub [r8, r9], r10

当我使用时

 sed -i.bak "s/mov r1, [r1, r2]/sub [r8, r9], r10/g" file.S

它不起作用。

我该怎么做?

【问题讨论】:

    标签: search sed replace


    【解决方案1】:

    两件事。

    1. 匹配表达式中的括号需要转义,它们在正则表达式中有特殊含义。
    2. 您应该保护 sed 脚本免受 shell 扩展。使用双引号会强制展开。单引号会关闭扩展。

    因此:

    's/mov r1, \[r1, r2\]/sub [r8, r9], r10/g'
    

    在编写正确的脚本时,也许您可​​以跳过内联编辑。像这样:

    sed 's/mov r1, \[r1, r2\]/sub [r8, r9], r10/g' file.S
    

    【讨论】:

    • 我想用一个变量代替常量字符串?即,我希望 shell 扩展命令。 string = "mov r1, [r1, r2]" sed ''s/$string/$replace_string/g'' file.S.
    【解决方案2】:

    尝试使用转义括号's/mov r1, \[r1, r2\]/sub \[r8, r9\], r10/g'

    【讨论】:

      【解决方案3】:

      在 sed 的替换命令中转义括号 -- [ ] -- 将按照您期望的方式处理您的文件。这是用括号转义的命令重写:

      sed 's/mov r1, \[r1, r2\]/sub [r8, r9], r10/g' file.S
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-10
        • 2020-08-09
        • 2017-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        相关资源
        最近更新 更多