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

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


当前回答

非常好的例子。我在编辑许多文件时遇到了挑战,而-i选项似乎是在find命令中使用它的唯一合理解决方案。下面的脚本在每个文件的第一行前面添加“version:”:

find . -name pkg.json -print -exec sed -i '.bak' '1 s/^/version /' {} \;

其他回答

下面的程序在我的mac上运行良好

sed -i.bak 's/foo/bar/g' sample

在示例文件中,我们用bar替换foo。原始文件的备份将保存在sample.bak中

要编辑内联而不备份,请使用以下命令

sed -i'' 's/foo/bar/g' sample

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

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

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

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的旧内容。

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

如果你想替换包含'/'的sting,你可以使用'?'。例如,将所有*.py文件的“/usr/local/bin/python”替换为“/usr/bin/python3”。

找到。/usr/bin/python ?/usr/bin/python3?G ' {} \;

就像《007:大破天幕杀机》中Moneypenny说的:“有时候旧的方法是最好的。” 金凯德后来也说过类似的话。

$ printf ',s/false/true/g\nw\n' | ed {YourFileHere}

快乐编辑到位。 增加了'\nw\n'来写入文件。很抱歉没有及时回复请求。