sed:反斜杠怎么办? [复制]
Posted
技术标签:
【中文标题】sed:反斜杠怎么办? [复制]【英文标题】:sed: what to do with backslash? [duplicate] 【发布时间】:2012-03-13 13:53:14 【问题描述】:我想用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
【问题讨论】:
$line
中有什么内容? $newline
中有什么内容?您将反斜杠的出现次数加倍以匹配单个反斜杠。
$line
和 $newline
是什么(回声告诉我们?)
当然 $line 是行:"Some Text that should be changed \" 而 $newline 是新行,我想写的不是那一行。
$newline
值是否包含任何斜杠或反斜杠?
【参考方案1】:
您需要首先转义您在sed
命令中使用的字符串,例如:
line=$(echo $line | sed 's/\\/\\\\/g')
这将把它从:
Some Text that should be changed \
进入:
Some Text that should be changed \\
这将阻止它转义最终分隔符。
【讨论】:
【参考方案2】:一个可能的原因是您的$line
或$newline
包含分隔符/
。
请尝试一些您的模式中没有出现的其他分隔符。
例如
sed -i "s@$line@$newline@" $MyFile
sed -i "s#$line#$newline#" $MyFile
-- 根据@paxdiablo 的 cmets 进行编辑。
变量名$line
具有误导性。它应该是一个模式。
所以你必须确保它是一个有效的模式,其中反斜杠\
应该用\\
转义
【讨论】:
实际上,我不确定更改分隔符是否会有所帮助,因为正在使用的字符串$line
以 `` 结尾 - 这意味着它将转义 any 分隔符.
@paxdiablo 你是对的。变量名$line
具有误导性。它应该是$pattern
。【参考方案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
既不包含任何斜线也不包含任何反斜线,你就足够安全了。
【讨论】:
以上是关于sed:反斜杠怎么办? [复制]的主要内容,如果未能解决你的问题,请参考以下文章