【问题标题】:BSD sed: extra characters at the end of d commandBSD sed:d 命令末尾的额外字符
【发布时间】:2014-11-22 18:03:40
【问题描述】:

我在 mac OS 上使用 sed 命令,以下是正文。

$ cat pets.txt 
This is my cat
  my cat's name is betty
This is your dog
  your dog's name is frank
This is your fish
  your fish's name is george
This is my goat
  my goat's name is adam

当我运行时:(BSD sed)

$ sed '3,6 {/This/d}' pets.txt

显示错误:

sed: 1: "3,6 {/This/d}": extra characters at the end of d command

它有什么问题?当我使用gsed(GNU sed) 时,效果很好。

【问题讨论】:

    标签: sed bsd


    【解决方案1】:

    对于因类似错误消息而发现此问题的任何人,但由于尝试在 Mac OS X

    上进行就地编辑

    根据https://github.com/lmquang/til/issues/18

    OS X 需要明确指定扩展。解决方法是设置一个空字符串

    $ sed -i '' 's/megatron/pony/g' /path/to/file.txt
    
             ^^
    

    man sed:

    -i extension

    就地编辑文件,以指定的扩展名保存备份。 如果提供零长度扩展名,则不会保存备份。 不建议在就地编辑文件时提供零长度扩展名,因为在以下情况下您可能会损坏或部分内容磁盘空间耗尽等。

    因此,当extension 被省略时,Mac OS X 上似乎存在问题,因此您必须为 -i 提供一个空字符串 ('')。

    另见https://unix.stackexchange.com/a/112024/23614

    如果使用 FreeBSD 或 OS/X,请将 -i 替换为 -i ''

    【讨论】:

      【解决方案2】:

      最简单的解决方案是在d 后面加一个分号(显示的空格是可选的):

      sed -e '3,6 { /This/d; }' pets.txt
      

      BSD sed 的布局比 GNU sed 更复杂。有许多 GNU 扩展不属于 BSD sed,这就是其中之一。分号不是问题的通用解决方案,尽管它确实解决了许多问题。您还可以将命令分散到多行,或将它们放入多个 -e 选项或各种其他“技巧”中。

      【讨论】:

        【解决方案3】:

        您依赖于 GNU 扩展,它允许 {} 成为单个表达式的一部分。为了使它可移植,你需要把它丑化一点:

        sed -e 3,6{ -e /This/d -e } pets.txt
        

        您也可以将命令放入文件中,每行一个:

        3,6 {
          /This/d
        }
        

        有关原因的更多信息,请参阅此处:https://unix.stackexchange.com/questions/13711/differences-between-sed-on-mac-osx-and-other-standard-sed

        【讨论】:

          猜你喜欢
          • 2018-07-07
          • 2017-04-12
          • 1970-01-01
          • 2013-03-20
          • 1970-01-01
          • 2021-01-30
          • 1970-01-01
          • 2023-03-12
          • 1970-01-01
          相关资源
          最近更新 更多