我试图找出是否可以在单个sed命令中编辑一个文件,而无需手动将编辑的内容流到一个新文件中,然后将新文件重命名为原始文件名。
我尝试了-i选项,但是Solaris系统说-i是非法选项。还有别的办法吗?
我试图找出是否可以在单个sed命令中编辑一个文件,而无需手动将编辑的内容流到一个新文件中,然后将新文件重命名为原始文件名。
我尝试了-i选项,但是Solaris系统说-i是非法选项。还有别的办法吗?
当前回答
下面的程序在我的mac上运行良好
sed -i.bak 's/foo/bar/g' sample
在示例文件中,我们用bar替换foo。原始文件的备份将保存在sample.bak中
要编辑内联而不备份,请使用以下命令
sed -i'' 's/foo/bar/g' sample
其他回答
下面的程序在我的mac上运行良好
sed -i.bak 's/foo/bar/g' sample
在示例文件中,我们用bar替换foo。原始文件的备份将保存在sample.bak中
要编辑内联而不备份,请使用以下命令
sed -i'' 's/foo/bar/g' sample
为了在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'{}来处理名称中有空格的文件。
你可以使用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
支持-i选项就地编辑文件的sed版本写入临时文件,然后重命名该文件。
或者,你可以只使用ed。例如,要更改文件file.txt中所有出现的foo为bar,你可以这样做:
echo ',s/foo/bar/g; w' | tr \; '\012' | ed -s file.txt
语法类似于sed,但肯定不完全相同。
即使没有-i支持sed,也可以很容易地编写一个脚本来完成这项工作。而不是sed -i 's/foo/bar/g'文件,你可以做内联文件sed 's/foo/bar/g'。这样的脚本编写起来很简单。例如:
#!/bin/sh
IN=$1
shift
trap 'rm -f "$tmp"' 0
tmp=$( mktemp )
<"$IN" "$@" >"$tmp" && cat "$tmp" > "$IN" # preserve hard links
对于大多数用途应该是足够的。