SED没有工作[未终止的's'命令]

时间:2015-07-27 06:14:20

标签: linux sed

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

3 个答案:

答案 0 :(得分: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 :(得分:0)

你的命令应该是:

sed -i "s~${searchString}~${replacementString}~g" $file
  • ~错过了内部的patterne分隔符
  • 简单 - &gt;变量替换的双引号

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

答案 2 :(得分:0)

我猜你试图替换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并在搜索模式和替换字符串之间添加缺少的~分隔符。你在搜索字符串中有它(由于单引号而没有被插值)但是它是一个分隔符,而不是搜索字符串的一部分,所以将它放在{{1脚本本身。
  • 搜索模式需要包含一个后向引用,然后将其包含在替换中。
  • sed标志是多余的,除非您真的希望每个输入行找到多个匹配项。