如何将input和输出的sed命令作为同一个文件运行?

我正在尝试在shell脚本中使用sed命令,我想删除读取STARTremoveThisComment行和读取STARTremoveThisComment行。

我能够做到这一点,当我把它复制到一个新的文件使用

 sed 's/STARTremoveThisComment//' > test 

但是,我怎样才能做到这一点通过使用相同的文件作为input和输出?

sed -i (或扩展版本, --in-place )将自动执行通常用--in-place实现完成的进程,即将输出发送到临时文件,然后将其重命名为原始文件。

-i用于就地编辑,您还可以提供用于保留原始副本的备份后缀:

 sed -i.bak fileToChange sed --in-place=.bak fileToChange 

这两个都将原始文件保存在fileToChange.bak

请记住,就地编辑可能不适用于所有的sed实现,但它在GNU sed ,应该可以在所有的Linux版本上使用,就像你的标签一样。

如果您使用的是更原始的实现,则可以使用如下所示的内容:

 sed 'whatever' oldfile >newfile ; mv newfile oldfile 

虽然更多的错误检查会很好。

你真的不应该使用sed。 这个问题似乎经常出现得很滑稽,而且看起来很奇怪,因为一般的解决scheme如此微不足道,人们想知道如何在sed,python和ruby等中做到这一点。如果你想在input上运行一个filter并覆盖它,使用下面的简单脚本:

 #!/bin/sh -e in=${1?No input file specified} mv $in ${bak=.$in.bak} shift "$@" < $bak > $in 

把它放在可执行文件名inlinepath中,然后通常就解决了这个问题。 例如:

 inline input-file sed -es/foo/bar/g 

现在,如果您想要添加逻辑来保留多个备份,或者如果您有一些选项来更改备份命名scheme,或者其他方法,则可以将其修复到一个位置。 用perl处理文件时,备份文件上的单向计数器是什么命令行选项? 那ruby怎么样? gnu-sed的选项不同吗? awk如何处理它? unix的全部重点在于工具只能做一件事。 处理备份文件的逻辑是第二件事,需要分解。 如果您正在实施一个工具,请不要添加逻辑来创build备份文件。 告诉你的用户使用第二个工具。 整合是不好的。 模块化是好的。 这是unix的方式。

注意这个脚本有几个问题。 例如,input文件的许可/模式可能被改变。 我相信还有无数的其他问题。 但是,通过将备份逻辑放在包装脚本中,您可以将所有这些问题本地化,而不必担心sed覆盖文件并更改模式,而python会将文件保留在原位,并且不会更改inode在这两种情况下,重点是不是所有的工具都会使用相同的逻辑,而包装脚本将会。)

您可以使用标志-i进行就地编辑,使用-e指定正常的脚本expression式:

 sed -i -e 's/pattern_to_search/text_to_replace/' file.txt 

要删除符合特定模式的行,可以使用更简单的语法。 注意d标志:

 sed -i '/pattern_to_search/d' file.txt 

据我所知,不可能使用相同的文件进行input和输出。 尽pipe一个解决scheme是创build一个shell脚本,将其保存到另一个文件中,但删除旧的input并将输出重命名为input文件名。

 sed -es/try/this/g input.file > output.file;mv output.file input.file