我正在尝试使用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
答案 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分隔符但
答案 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的黑暗和阴暗的范围内)。~
分隔符。你在搜索字符串中有它(由于单引号而没有被插值)但是它是一个分隔符,而不是搜索字符串的一部分,所以将它放在{{1脚本本身。sed
标志是多余的,除非您真的希望每个输入行找到多个匹配项。