我试图找出是否可以在单个sed命令中编辑一个文件,而无需手动将编辑的内容流到一个新文件中,然后将新文件重命名为原始文件名。

我尝试了-i选项,但是Solaris系统说-i是非法选项。还有别的办法吗?


当前回答

您没有指定使用什么shell,但是对于zsh,您可以使用=()构造来实现这一点。大致如下:

cp =(sed ... file; sync) file

=()类似于>(),但创建一个临时文件,当cp终止时自动删除。

其他回答

你可以使用vi

vi -c '%s/foo/bar/g' my.txt -c 'wq'

请注意,在OS X上运行此命令时,您可能会遇到奇怪的错误,如“无效命令代码”或其他奇怪的错误。要修复此问题,请尝试

sed -i '' -e "s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g" <file>

这是因为在OSX版本的sed上,-i选项需要一个扩展参数,因此您的命令实际上被解析为扩展参数,文件路径被解释为命令代码。来源:https://stackoverflow.com/a/19457213

为了在Mac上解决这个问题,我不得不在core-utils中添加一些unix函数。

brew install grep
==> Caveats
All commands have been installed with the prefix "g".
If you need to use these commands with their normal names, you
can add a "gnubin" directory to your PATH from your bashrc like:
  PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"

使用gsed而不是sed调用。mac默认不喜欢grep -rl显示带有。/前缀的文件名。

~/my-dir/configs$ grep -rl Promise . | xargs sed -i 's/Promise/Bluebird/g'

sed: 1: "./test_config.js": invalid command code .

我还必须使用xargs -I{} sed -I 's/Promise/Bluebird/g'{}来处理名称中有空格的文件。

Sed支持就地编辑。来自男人sed:

-i[SUFFIX], --in-place[=SUFFIX]

    edit files in place (makes backup if extension supplied)

例子:

假设你有一个文件hello。图文短信:

hello world!

如果你想保留旧文件的备份,使用:

sed -i.bak 's/hello/bonjour' hello.txt

你会得到两个文件:hello.txt,内容如下:

bonjour world!

还有hello。txt。bak的旧内容。

如果不想保留副本,只需不要传递扩展参数。

您没有指定使用什么shell,但是对于zsh,您可以使用=()构造来实现这一点。大致如下:

cp =(sed ... file; sync) file

=()类似于>(),但创建一个临时文件,当cp终止时自动删除。