【问题标题】:`sed` works, but `sed -i` returns an error`sed` 有效,但 `sed -i` 返回错误
【发布时间】:2011-07-26 13:31:16
【问题描述】:

我差点把自己的问题扯下来。

你看,这条线有效:

sed -r -e 's/^([^#a-z]+)localhost/\1hostname.domain hostname localhost/' /etc/hosts

但是添加了itty选项“i”:

sed -ir -e 's/^([^#a-z]+)localhost/\1hostname.domain hostname localhost/' /etc/hosts

结果:

sed: -e expression #1, char 60: invalid reference \1 on `s' command's RHS

谁能告诉我这是怎么回事?


更新:

伙计们,你们都给出了正确的答案。显然,我在那里被暂时的愚蠢震惊了。谢谢你提醒我:)

(也就是说,@T.J. Crowder 先回答,所以我会给他我的复选标记)

【问题讨论】:

  • 您好,我刚刚遇到这个问题,您好像忘记接受答案了。
  • 我可以发誓我已经点击了复选标记...哦,好吧,再做一次也没坏处:-P

标签: linux sed


【解决方案1】:

您已关闭-r(扩展语法)选项,因为您附加到-i 的不是更多选项,而是可选的备份后缀。从手册页:

-i[后缀], --in-place[=后缀]

   就地编辑文件(如果提供扩展名,则进行备份)

所以把它们分开:

sed -i -r -e 's/^([^#a-z]+)localhost/\1hostname.domain hostname localhost/' /etc/hosts

【讨论】:

  • 是的,我很笨。在您发布答案前几秒钟,在man sed 中看到了-i 的条目。将您的标记为正确。 (不,我不需要任何备份,所以不需要你的 -ir;只需 -i -r
  • +1 用于实际解释答案。 SO 并不是要告诉人们 RTFM,而是要告诉他们应该在 FM 中的哪个位置看,以及为什么,恕我直言。
【解决方案2】:

我认为你应该将选项分开:写 -i -r 而不是 -ir,因为 -i 可能会将 r 解释为附加到旧的未编辑文件的后缀,因此不会使用 -r

【讨论】:

    【解决方案3】:

    “-ir”的含义不同于“-i -r”或“-ri”,参见手册页。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 2013-02-17
      • 2021-09-24
      • 1970-01-01
      • 2013-05-14
      相关资源
      最近更新 更多