2011-07-31 40 views
7

我正在使用Unix sed命令进行一些操作。我正在尝试替换和附加命令,在一个文件中。但难点是,我必须创建一个中间文件,然后执行mv将其重命名为原始文件。如何替换而不在sed中创建中间文件?

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

[[email protected] practice]# sed '1i\ 
> Today is Sunday 
> ' file1 > file1 

[[email protected] practice]# cat file1 
[[email protected] practice]# 

该文件被删除!

[[email protected] practice]# sed 's/director/painter/' file1 > file1 
[[email protected] practice]# cat file1 

该文件被删除!

+1

有人投了我的问题吗?但为什么? – kingsmasher1

回答

11

GNU sed知道一个选项-i这是就地编辑给定的文件。

在做什么实际发生的是,该文件是程序(它得到它的名字作为参数)来自各地从阅读任何东西之前打开截断由外壳操作file1 > file1

更新

的sed的操作页面上的-i选项以下(感谢桑德兰的提到它):

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

      edit files in place (makes backup if extension supplied) 
+0

真的吗?你的意思是使用-i选项我可以替换并追加到同一个文件?让我试试。 – kingsmasher1

+2

务必避免在'-i'之后对任何其他选项参数进行短分组。我经常使用'sed -i -r'来执行ERE的in-place sed,但不能使用'sed -ir',因为这会为备份文件创建一个后缀'r'。 –

+0

* in-place *如在中,编辑匹配的行,让其他人独处。 *不*附加。 –

1

sed的-i.bak的人/导演/画家/” file1的

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

    edit files in place (makes backup if extension supplied) 
+0

谢谢,是的,我试过它的工作。但是控制台输出被抑制。 Upvote for you and Fritschy :) – kingsmasher1

11

试试这个 -

sed -i '' 's/originaltext/replacementtext/g' filename | cat filename 

-i“'是为了提供备份文件。如果你确信你的替换不会导致问题,你可以把''通过没有备份文件

/g是全球替代。如果你在一行中有多个originaltext,那么使用/ g选项会替换所有其他的只替换第一个。

+0

在没有空间的情况下使用'sed -i'''在gitbash上工作 – cjsimon

+0

'sed -i'''(带空格)可以和BSD sed一起使用,但只能使用'sed -i' '(无空格)将与GNU sed一起使用。实际上令人沮丧。 –