我试图找出是否可以在单个sed命令中编辑一个文件,而无需手动将编辑的内容流到一个新文件中,然后将新文件重命名为原始文件名。
我尝试了-i选项,但是Solaris系统说-i是非法选项。还有别的办法吗?
我试图找出是否可以在单个sed命令中编辑一个文件,而无需手动将编辑的内容流到一个新文件中,然后将新文件重命名为原始文件名。
我尝试了-i选项,但是Solaris系统说-i是非法选项。还有别的办法吗?
当前回答
就像《007:大破天幕杀机》中Moneypenny说的:“有时候旧的方法是最好的。” 金凯德后来也说过类似的话。
$ printf ',s/false/true/g\nw\n' | ed {YourFileHere}
快乐编辑到位。 增加了'\nw\n'来写入文件。很抱歉没有及时回复请求。
其他回答
下面的程序在我的mac上运行良好
sed -i.bak 's/foo/bar/g' sample
在示例文件中,我们用bar替换foo。原始文件的备份将保存在sample.bak中
要编辑内联而不备份,请使用以下命令
sed -i'' 's/foo/bar/g' sample
如果您正在替换相同数量的字符,并且在仔细阅读“就地”编辑文件后……
您还可以使用重定向操作符<>打开文件进行读写:
sed 's/foo/bar/g' file 1<> file
现场观看:
$ cat file
hello
i am here # see "here"
$ sed 's/here/away/' file 1<> file # Run the `sed` command
$ cat file
hello
i am away # this line is changed now
从Bash参考手册→3.6.10打开文件描述符读写:
重定向操作符 [n] < >词 使文件名为word展开的文件被打开 在文件描述符n或文件描述符0上进行读写 如果未指定n。如果该文件不存在,则创建该文件。
需要注意的一点是,sed不能自己写文件,因为sed的唯一目的是充当“流”(即stdin、stdout、stderr和其他>&n缓冲区、套接字等的管道)上的编辑器。考虑到这一点,您可以使用另一个命令tee将输出写回文件。另一种选择是创建一个补丁,从管道的内容到diff。
三通法
sed '/regex/' <file> | tee <file>
修补方法
sed '/regex/' <file> | diff -p <file> /dev/stdin | patch
更新:
另外,请注意patch将从diff输出的第一行获取要更改的文件:
Patch不需要知道要访问哪个文件,因为这在diff输出的第一行中找到:
$ echo foobar | tee fubar
$ sed 's/oo/u/' fubar | diff -p fubar /dev/stdin
*** fubar 2014-03-15 18:06:09.000000000 -0500
--- /dev/stdin 2014-03-15 18:06:41.000000000 -0500
***************
*** 1 ****
! foobar
--- 1 ----
! fubar
$ sed 's/oo/u/' fubar | diff -p fubar /dev/stdin | patch
patching file fubar
-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
您没有指定使用什么shell,但是对于zsh,您可以使用=()构造来实现这一点。大致如下:
cp =(sed ... file; sync) file
=()类似于>(),但创建一个临时文件,当cp终止时自动删除。