我试图找出是否可以在单个sed命令中编辑一个文件,而无需手动将编辑的内容流到一个新文件中,然后将新文件重命名为原始文件名。
我尝试了-i选项,但是Solaris系统说-i是非法选项。还有别的办法吗?
我试图找出是否可以在单个sed命令中编辑一个文件,而无需手动将编辑的内容流到一个新文件中,然后将新文件重命名为原始文件名。
我尝试了-i选项,但是Solaris系统说-i是非法选项。还有别的办法吗?
当前回答
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的旧内容。
如果不想保留副本,只需不要传递扩展参数。
其他回答
-i选项将编辑的内容传输到一个新文件中,然后在幕后重命名它。
例子:
sed -i 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' filename
而在macOS上,你需要:
sed -i '' 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' filename
支持-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
对于大多数用途应该是足够的。
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的旧内容。
如果不想保留副本,只需不要传递扩展参数。
就像《007:大破天幕杀机》中Moneypenny说的:“有时候旧的方法是最好的。” 金凯德后来也说过类似的话。
$ printf ',s/false/true/g\nw\n' | ed {YourFileHere}
快乐编辑到位。 增加了'\nw\n'来写入文件。很抱歉没有及时回复请求。
您没有指定使用什么shell,但是对于zsh,您可以使用=()构造来实现这一点。大致如下:
cp =(sed ... file; sync) file
=()类似于>(),但创建一个临时文件,当cp终止时自动删除。