我想用sed
更改其中一行,但在该行的末尾有一个反斜杠:
Some Text that should be changed \
我用过:
sed -i "s/$line/$newline/" $MyFile
塞德说:
sed: -e expression #1, char 44: unknown option to `s'
sed: -e expression #1, char 84: unterminated `s' command
答案 0 :(得分:3)
您需要首先在sed
命令中转义您正在使用的字符串,例如:
line=$(echo $line | sed 's/\\/\\\\/g')
这将转为:
Some Text that should be changed \
成:
Some Text that should be changed \\
将阻止它逃离最终分隔符。
答案 1 :(得分:3)
鉴于你有:
line="Some Text that should be changed \\"
所以你的echo "$line"
会产生:
Some Text that should be changed \
然后sed
看到:
sed -i "s/Some Text that should be changed \/Your replacement/" yourfile
并且反斜杠表示您的搜索模式尚未结束,因此替换命令格式错误 - 正如错误消息所示。
你必须在字符串的末尾加上第二个反斜杠。无数种方法之一是:
case "$line" in
(*\\) line="$line\\";;
esac
这只是创造性......但它的优点是不执行任何外部命令来修复字符串。 bash
还提供了更多直接替换。
现在你可以做到:
sed -i "s/^$line$/$newline/" $myFile
只要$newline
既不包含任何斜杠也不包含任何反斜杠,您就足够安全了。
答案 2 :(得分:1)
一个可能的原因是您的$line
或$newline
包含分隔符/
。
请尝试一些其他模式中没有出现的分隔符。
E.g。
sed -i "s@$line@$newline@" $MyFile
sed -i "s#$line#$newline#" $MyFile
- 根据@ paxdiablo的评论进行编辑。
变量名$line
误导。它应该是模式。
因此,您必须确保它是一个有效的模式,其中应使用\
\\