【问题标题】:sed: what to do with backslash? [duplicate]sed:反斜杠怎么办? [复制]
【发布时间】: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 值是否包含任何斜杠或反斜杠?

标签: linux bash sed


【解决方案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 既不包含任何斜线也不包含任何反斜线,你就足够安全了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2011-10-14
      • 2011-12-13
      • 1970-01-01
      相关资源
      最近更新 更多