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:反斜杠怎么办? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本如何把反斜杠替换成斜杠反斜杠,比如2014\/5\/10变成2014/5/10,急用谢谢!

Sed 不匹配反斜杠文字还是我做错了啥?

使用 sed [重复] 替换包含反斜杠的字符串

当下一个字符为“t”时,使用sed命令转义反斜杠

linux中sed命令如何运用‘\ ’ 反斜杠

使用带反斜杠的sed命令时出现AWS CloudFormation模板验证错误