如何在不创建sed中间文件的情况下替换?

kin*_*er1 10 unix linux sed

我正在用Unix sed命令进行一些动手操作.我在文件中尝试替换和追加命令.但困难在于,我必须创建一个中间文件,然后mv将其重命名为原始文件.

有没有办法在同一个文件中一次性完成?

[root@dhcppc0 practice]# sed '1i\
 > Today is Sunday
 > ' file1 > file1

[root@dhcppc0 practice]# cat file1
[root@dhcppc0 practice]#
Run Code Online (Sandbox Code Playgroud)

该文件已被删除!

[root@dhcppc0 practice]# sed 's/director/painter/' file1 > file1
[root@dhcppc0 practice]# cat file1
Run Code Online (Sandbox Code Playgroud)

该文件已被删除!

小智 17

试试这个 -

sed -i '' 's/originaltext/replacementtext/g' filename | cat filename
Run Code Online (Sandbox Code Playgroud)

-i''用于提供备份文件.如果您确信您的替换不会导致问题,您可以将''传递给没有备份文件

/ g用于全局替换.如果你在一行中有多个原始文本,那么使用/ g选项将替换所有其他只会替换第一个原始文本.

  • `sed -i ''`(带空格)适用于 BSD sed,但只有 `sed -i''`(无空格)适用于 GNU sed。实际上很令人沮丧。 (2认同)

Mar*_*gen 13

GNU sed知道一个选项-i,它可以对给定文件进行就地编辑.

在执行操作时file1 > file1,实际发生的是,在程序(将其名称作为参数)之前,shell 打开截断文件,从中读取任何内容.

更新:

sed的手册页在-i选项上说明了以下内容(感谢Delan提及它):

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if extension supplied)
Run Code Online (Sandbox Code Playgroud)

  • 请务必避免在`-i`之后对任何其他选项参数进行短分组.我经常使用`sed -i -r`来使用ERE进行就地sed,但不能使用`sed -ir`,因为这会产生备份,后缀为`r`到备份文件. (2认同)