我在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)
时,效果很好。
答案 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