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

时间:2014-09-28 03:39:25

标签: 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 '3,6 {/This/d}' pets.txt

显示错误:

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

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

3 个答案:

答案 0 :(得分:11)

对于由于类似的错误消息而发现此问题但由于尝试在 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

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

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

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

您依赖于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