BSD sed:d 命令末尾有额外字符

37

我在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)时,它运行良好。

3个回答

105

如果有人因类似的错误信息而找到了这个问题,但是这个错误是由于在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 上省略 extension 会出现问题,因此您必须使用空字符串('')提供 -i

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

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


2023年了,在OS X上仍然遇到这个问题。谢谢@user664833。 - Allen Oliver

12
最简单的解决方案是在d后面加上一个分号(空格是可选的):
sed -e '3,6 { /This/d; }' pets.txt

BSD sed比GNU sed更加挑剔布局。有许多GNU扩展不是BSD sed的一部分,其中包括这个。尽管分号并非解决所有问题的万能方法,但确实可以解决许多问题。您还可以将命令分散在多行中,或将它们放入多个-e选项中,或使用其他各种"技巧"。


1
这是真正的答案,-i '' 是另一个问题。 - Gui13

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接