在Linux和Mac上是否都可以调用sed在没有备份的情况下进行就地编辑?虽然OS X附带的BSD sed似乎需要sed -i "…,但GNU sed Linux发行版通常会将引号解释为空的输入文件名(而不是备份扩展名),并且需要sed -i…。
是否有适用于这两种风格的命令行语法,以便我可以在两个系统上使用相同的脚本?
在Linux和Mac上是否都可以调用sed在没有备份的情况下进行就地编辑?虽然OS X附带的BSD sed似乎需要sed -i "…,但GNU sed Linux发行版通常会将引号解释为空的输入文件名(而不是备份扩展名),并且需要sed -i…。
是否有适用于这两种风格的命令行语法,以便我可以在两个系统上使用相同的脚本?
当前回答
我遇到了这个问题。唯一快速的解决方案是将mac中的sed替换为gnu版本:
brew install gnu-sed
其他回答
以下是我在Linux和OS X上的工作:
Sed -i' ' <expr> <文件>
例如,对于包含aaabbaaba的文件f
Sed -i' 's/b/c/g' f
在Linux和Mac上生成aaaccaaca。注意,这里有一个带引号的字符串,其中包含一个空格,-i和字符串之间没有空格。单引号和双引号都可以。
在Linux上,我在Ubuntu 14.04.4下使用bash版本4.3.11,在OS X 10.11.4 El Capitan (Darwin 15.4.0)下使用Mac版本3.2.57。
问题是sed是一个流编辑器,因此就地编辑是一个非posix扩展,每个人实现它的方式都不同。这意味着对于就地编辑,您应该使用ed以获得最佳的可移植性。如。
ed -s foobar.txt <<<$',s/foo/bar/g\nw'
参见https://wiki.bash-hackers.org/howto/edit-ed。
Steve Powell的回答是非常正确的,在OSX和Linux (Ubuntu 12.04)上查阅sed的MAN页面强调了两个操作系统中“就地”sed使用的不兼容性。
JFYI,使用Linux版本的sed, -i和任何引号(表示空文件扩展名)之间不应该有空格,因此
sed Linux手册
#Linux
sed -i""
and
药效发作
#OSX (notice the space after the '-i' argument)
sed -i ""
我在一个脚本中通过使用alias'd命令和bash 'if'中的'uname'的OS-name输出来解决这个问题。在解释引号时,试图将依赖于操作系统的命令字符串存储在变量中是错误的。为了扩展/使用脚本中定义的别名,必须使用'shopt -s expand_aliases'。这里讨论Shopt的用法。
回答:没有。
最初接受的答案实际上没有做到所要求的(如评论中所述)。(我在寻找文件-e在我的目录中“随机”出现的原因时找到了这个答案。)
显然没有办法让sed -i在MacOS和Linuces上一致地工作。
我的建议是,无论如何,不要使用sed进行就地更新(它具有复杂的故障模式),而是生成新文件,然后重命名它们。换句话说:避免-i。
这适用于GNU sed,但不适用于OS X:
sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file
这适用于OS X,但不适用于GNU sed:
sed -i '' -e 's/foo/bar/' target.file
在OS X上
不能使用sed -i -e,因为备份文件的扩展名将被设置为-e 由于同样的原因,不能使用sed -i " -e -它需要在-i和"之间有一个空格。