在 postinstall 调用时,sed 无法更改文件。

16 浏览
0 Comments

在 postinstall 调用时,sed 无法更改文件。

在Linux和Mac上,是否有一种不需要备份的sed命令来进行原地编辑?虽然OS X附带的BSD sed似乎需要sed -i \'\' …,而GNU sed Linux发行版通常将引号解释为空输入文件名(而不是备份扩展名),需要使用sed -i …。\n是否有一种命令行语法适用于两种版本,这样我就可以在两个系统上使用相同的脚本?

0
0 Comments

在OSX上,我总是通过Homebrew安装GNU sed版本,以避免在脚本中出现问题,因为大多数脚本都是针对GNU sed版本编写的。

brew install gnu-sed --with-default-names

然后,你的BSD sed将被GNU sed替换。

或者,你可以安装不带default-names的版本,但是需要进行以下操作:

- 在安装gnu-sed后按照指示更改你的PATH

- 在你的脚本中检查选择gsedsed,取决于你的系统。

--with-default-names 已经从homebrew-core中删除了,更多信息请参考这个答案。现在,在安装gnu-sed时,安装说明指定你需要将gnubin添加到你的PATH中:PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

Homebrew软件包的页面 -- formulae.brew.sh/formula/coreutils -- 建议如果你希望在Mac工具之前将它们添加到你的路径中,可以将以下内容添加到你的bashrc中:PATH="$(brew --prefix)/opt/coreutils/libexec/gnubin:$PATH"

0
0 Comments

问题的原因是在OS X系统上,无法使用命令sed -i -e,因为备份文件的扩展名会被设置为-e,同样的原因也适用于命令sed -i'' -e,由于-i''之间需要有空格。

解决方法是使用命令sed -i '' -e,这在OS X系统上有效,但在GNU sed上无效。

需要注意的是,在shell解析时,-i-i''是相同的,因此sed命令无法对这两个命令进行不同的处理,因为它们接收的参数是完全相同的。

0
0 Comments

问题的出现原因是在Ubuntu 16.04上,使用sed -i.bak 's/foo/bar/' file命令时,会将原始文件覆盖为0字节,并创建0字节大小的.bak文件。而解决方法是使用sed -i.bak 's/foo/bar/' file && rm file.bak命令,先执行sed命令进行编辑,然后再删除.bak文件。在macOS Sierra中,sed命令在使用-i选项时需要使用-e选项来指定编辑命令,因此完整的解决方法是sed -i.bak -e 's/foo/bar/' filename,这样可以创建备份文件并进行原地编辑。

0