sed错误:未终止的's'命令

14

我运行了下面的sed命令

sed -i s/abc=.*$/abc=def ghi/g hpq_sf_attach_wf_param.txt

然后它给我了一个错误:

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

我注意到问题是由于defghi之间有空格导致的。 有什么办法可以解决吗?


可能是在shell变量周围加引号的时间?的重复内容。 - tripleee
可能是在bash中使用sed时出现未终止的s命令错误的重复问题。 - tripleee
2个回答

16

您需要使用引号来保护特殊字符,包括空格、$*

sed -i 's/abc=.*$/abc=def ghi/g' hpq_sf_attach_wf_param.txt

嗨,添加单引号导致更新失败,在目标文件 hpq_sf_attach_wf_param.txt 中没有任何更改~尽管它应该已经更新了。 - iwan
你确定你的模式是正确的吗?也许编辑你的问题,包括一些来自 hpq_sf_attach_param.txt 的示例行? - geekosaur

5

所以geekosaur说得对。但是你遇到这个问题的原因是因为通配符需要使用双引号,因为使用单引号时,它将把它们作为文字字符而不是你想要的含义进行处理。

sed -i "s/abc=.*$/abc=def ghi/g" hpq_sf_attach_wf_param.txt

此外,如果“def”和“ghi”之间的空格导致问题,添加“\”应该有助于将其视为字面上的空格。
sed -i "s/abc=.*$/abc=def\ ghi/g" hpq_sf_attach_wf_param.txt

这个解释毫无意义:“通配符需要用双引号,因为单引号会将其视为字面字符”。字符串中唯一相关的shell元字符是$,而$/不是有效的shell变量,因此保持不变。考虑:echo "s/abc=.*$/abc=def ghi/g"|md5sum; echo 's/abc=.*$/abc=def ghi/g'|md5sum。如果有区别,为什么md5sum输出相同?此外,\ 没有任何有用的作用。 - jhnc
可以有人建议我这里出了什么问题吗 - sed -i "s|##CONNECTION_DETAILS##|${CONNECTION_DETAILS}|g" dep.yaml。CONNECTION_DETAILS的值以编码形式CSAgewogICAgICAgICJjb25uZWN0aW9uX25hbWVfMSI6ICJPRlNBQV9BTkFMWVRJQ1NfUFVCIiwK ICAgICAgICAiZGF0YWJhc2VfbmFtZV8xIjogIk9GU0FBX0FOQUxZVElDU19QVUIiLAogICAgICAg ICJiaV9TZXJ2aWNlc18xIjpbImR2IiwicnBkIiwiYmlwdWJsaXNoZXIiXQogICAgICB9Cg== - Meenal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接