2012-02-23 98 views
1

我想sed改变其行之一,但在该行的末尾有一个反斜杠:sed:如何处理反斜杠?

Some Text that should be changed \ 

我使用:

sed -i "s/$line/$newline/" $MyFile 

sed的说:

sed: -e expression #1, char 44: unknown option to `s' 
sed: -e expression #1, char 84: unterminated `s' command 
+0

'$ line'是什么? '$ newline'中有什么?您将反斜杠的出现加倍以匹配单个反斜杠。 – 2012-02-23 06:43:53

+0

'$ line'和'$ newline'是什么(回显出来并让我们知道?) – 2012-02-23 06:44:08

+0

当然$ line是行:“应该更改一些文本”,$ newline是新行,我是想写而不是那一行。 – 2012-02-23 06:47:11

回答

3

您需要首先在sed命令内跳过您正在使用的字符串,如下所示:

line=$(echo $line | sed 's/\\/\\\\/g') 

这将打开它:

Some Text that should be changed \ 

到:

Some Text that should be changed \\ 

将逃逸的最后一个分隔符停止它。

1

一个可能的原因是您的$line$newline包含分隔符/

请尝试一些不会出现在您的模式中的其他分隔符。

E.g.

sed -i "[email protected][email protected][email protected]" $MyFile 
sed -i "s#$line#$newline#" $MyFile 

- 根据@ paxdiablo的评论进行编辑。

变量名称$line误导。它应该是模式

所以,你必须确保它是一个有效的模式,其中一个反斜杠\\\

+1

实际上,我不确定分隔符的更改会对此有所帮助,因为正在使用的字符串'$ line'以'\'结尾 - 这意味着它会转义_any_分隔符。 – paxdiablo 2012-02-23 06:47:51

+0

@paxdiablo你说得对。变量名'$ line'误导了。它应该是'$ pattern'。 – 2012-02-23 06:53:40

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既不包含任何斜杠也没有任何反斜杠,你会很安全。