我想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
我想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
您需要首先在sed
命令内跳过您正在使用的字符串,如下所示:
line=$(echo $line | sed 's/\\/\\\\/g')
这将打开它:
Some Text that should be changed \
到:
Some Text that should be changed \\
将逃逸的最后一个分隔符停止它。
一个可能的原因是您的$line
或$newline
包含分隔符/
。
请尝试一些不会出现在您的模式中的其他分隔符。
E.g.
sed -i "[email protected][email protected][email protected]" $MyFile
sed -i "s#$line#$newline#" $MyFile
- 根据@ paxdiablo的评论进行编辑。
变量名称$line
误导。它应该是模式。
所以,你必须确保它是一个有效的模式,其中一个反斜杠\
应\\
实际上,我不确定分隔符的更改会对此有所帮助,因为正在使用的字符串'$ line'以'\'结尾 - 这意味着它会转义_any_分隔符。 – paxdiablo 2012-02-23 06:47:51
@paxdiablo你说得对。变量名'$ line'误导了。它应该是'$ pattern'。 – 2012-02-23 06:53:40
进行转义既然你有:
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
既不包含任何斜杠也没有任何反斜杠,你会很安全。
'$ line'是什么? '$ newline'中有什么?您将反斜杠的出现加倍以匹配单个反斜杠。 – 2012-02-23 06:43:53
'$ line'和'$ newline'是什么(回显出来并让我们知道?) – 2012-02-23 06:44:08
当然$ line是行:“应该更改一些文本”,$ newline是新行,我是想写而不是那一行。 – 2012-02-23 06:47:11