如何在一个单独的sed命令中编辑文件?目前,我必须手动将编辑后的内容流式传输到一个新文件中,然后将新文件重命名为原始文件名。
我尝试了sed -i,但我的Solaris系统显示-i是一个非法选项。有其他方法吗?
我尝试了sed -i,但我的Solaris系统显示-i是一个非法选项。有其他方法吗?
您没有说明使用的是哪个shell,但是在zsh中,您可以使用=( )
结构来实现这一点。大致如下:
cp =(sed ... file; sync) file
=()
类似于>()
,但会创建一个临时文件,当cp
终止时该文件将自动删除。
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' {}
来处理文件名中含有空格的文件。
mv file.txt file.tmp && sed 's/foo/bar/g' < file.tmp > file.txt
应该保留所有硬链接,因为输出是定向回覆盖原始文件的内容,并且避免了需要特殊版本的sed的任何需求。
cp
而不是mv
时,这才有意义。 - undefinedfind . -name pkg.json -print -exec sed -i '.bak' '1 s/^/version /' {} \;
如果你想替换包含'/'的字符串,可以使用'?'。例如,将所有*.py文件中的'/usr/local/bin/python'替换为'/usr/bin/python3'。
find . -name \*.py -exec sed -i 's?/usr/local/bin/python?/usr/bin/python3?g' {} \;
-i
是 gnu sed 中的一个选项,但不属于标准 sed。使用该选项会将内容流式传输到新文件,然后将文件重命名,这可能不是您想要的。 - William Pursell