sed:如何处理反斜杠?

时间:2012-02-23 06:41:01

标签: linux bash sed

我想用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

3 个答案:

答案 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误导。它应该是模式

因此,您必须确保它是一个有效的模式,其中应使用\

转义反斜杠\\