【问题标题】:SED not working [unterminated `s' command]SED 不工作 [未终止的 `s' 命令]
【发布时间】:2015-07-27 06:14:20
【问题描述】:

我正在尝试通过以下命令使用 sed 替换文件内容

searchString='(<property *name="sourceUrl" *value="\)[^?]*~'
replacementString="file:///tmp/abc-efg"
sed -i 's~\${searchString}\1${replacementString}~g' $file

但它给了

sed: -e expression #1, char 42: unterminated `s' command

【问题讨论】:

    标签: linux sed


    【解决方案1】:

    您缺少分隔符(在您的情况下为 ~)。看起来你正试图把它放在$searchString 的末尾,这很奇怪。我不知道你为什么这样做。它不起作用的原因是变量没有在单引号字符串中展开。

    这可能有效:

    sed -i "s~${searchString}\1${replacementString}~g" $file
    

    真的,这样理解会更容易:

    ~ $ cat foo
    <property name="sourceUrl" value="someurl?param=val"></property>
    ~ $ searchString='\(<property *name="sourceUrl" *value="\)[^?]*'
    ~ $ replacementString='file:///tmp/abc-efg'
    ~ $ sed -e "s~${searchString}~\1${replacementString}~g" foo
    <property name="sourceUrl" value="file:///tmp/abc-efg?param=val"></property>
    

    【讨论】:

    • 1.它给了我sed: -e expression #1, char 43: Invalid back reference。 2.我想知道你为什么加了\` in start of searchString`。谢谢:)
    • \( 用于反向引用的开始。 \) 结束了。我已经用完整的会话更新了这个答案,这样你就可以确切地看到什么对我有用。
    【解决方案2】:

    你的命令应该是:

    sed -i "s~${searchString}~${replacementString}~g" $file
    
    • ~ 缺少内部模式分隔符
    • 简单 -> 用于变量替换的双引号

    但是

    • 小心你的 2 个在 sed 中被视为正则表达式的字符串(因此元字符应该被转义或分类

    【讨论】:

      【解决方案3】:

      我猜您正在尝试替换 value="..." 参数并保留其余参数?

      searchString='\(<property *name="sourceUrl" *value="\)[^"]*'
      replacementString="file:///tmp/abc-efg"
      sed -i "s~$searchString~\\1$replacementString~" "$file"
      

      我做了以下更改:

      • 左括号需要一个反斜杠(否则右括号也不应该是反斜杠 - 这取决于您的 sed 方言)
      • 匹配value="..." 字段的正则表达式是[^"]* 而不是[^?]*——我不知道问号在您的特定场景中是否有意义,但任何不是双引号的东西通常是安全可靠的匹配(在 using regex for structured data 的黑暗和阴暗领域内)。
      • 显然,fix quoting 并在搜索模式和替换字符串之间添加缺少的 ~ 分隔符。您将它放在搜索字符串中(由于单引号而没有被插值),但它是一个分隔符,而不是搜索字符串的一部分,因此将它放在 sed 脚本本身中更有意义。李>
      • 搜索模式需要包含一个反向引用,然后将其包含在替换中。
      • g 标志是多余的,除非您真的希望在每个输入行中找到多个匹配项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-29
        • 2019-05-04
        • 2013-06-11
        • 2012-05-05
        • 2012-07-10
        • 2013-11-27
        • 2018-05-29
        • 2015-09-25
        相关资源
        最近更新 更多