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

问题描述 投票:2回答:3

我在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)我在mac OS上使用sed命令,以下是文字。

sed bsd
3个回答
6
投票

最简单的解决办法是在 "我的名字 "后面加上一个分号。d (显示的空格是可选的)。

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

BSD sed 在布局上比 GNU sed. 有一些GNU的扩展不属于BSD的一部分。sed这就是其中之一。 分号并不是解决问题的通用方法,尽管它确实解决了很多问题。你也可以把命令分散在多行中,或者把它们放在多个 -e 选项,或其他各种 "技巧"。


1
投票

你依靠的是GNU的扩展,它可以让你 {} 是一个单一表达式的一部分。 为了使它可移植,你需要把它丑化一下。

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

你也可以把命令放到一个文件里, 每行一个:

3,6 {
  /This/d
}

更多关于为什么要这样做,请看这里。https:/unix.stackexchange.comquestions13711differences-between-sed-on-mac-osx-andother-standard-sed.


0
投票

对于那些因为类似的错误信息而发现这个问题的人,但由于试图对其进行 原地踏步 关于 Mac OS X

根据 https:/github.comlmquangtilissues18:

OS X 要求明确指定扩展名。变通的办法是 设置一个空字符串:

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

         ^^

man sed:

-i extension

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

所以,在Mac OS X上似乎有一个问题,当 extension 被省略了,所以你必须要提供 -i 用一个空字符串('').

另见 https:/unix.stackexchange.coma11202423614。:

如果使用FreeBSD或OSX,请将 -i-i ''.

© www.soinside.com 2019 - 2024. All rights reserved.