BSD sed:在d命令末尾添加额外字符

BSD sed:在d命令末尾添加额外字符,sed,bsd,Sed,Bsd,我在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: 1: "3,6 {/

我在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: 1: "3,6 {/This/d}": extra characters at the end of d command

怎么了?当我使用
gsed(gnused)
时,它工作得很好。

您依赖于GNU扩展,它允许
{
}
成为单个表达式的一部分。要使其便于携带,您需要对其进行一些修饰:

sed -e 3,6{ -e /This/d -e } pets.txt
您还可以将命令放入文件中,每行一个:

3,6 {
  /This/d
}

有关原因的更多信息,请参见此处:

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


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

适用于因类似错误消息而发现此问题,但由于试图在Mac OS X上进行就地编辑而导致的任何人

根据:

OSX要求显式指定扩展名。解决方法是设置空字符串:

man sed

-i扩展名

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

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

另见:

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

3,6 {
  /This/d
}
sed -e '3,6 { /This/d; }' pets.txt
$ sed -i '' 's/megatron/pony/g' /path/to/file.txt

         ^^