如何将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
把它放在可执行文件名inline
path中,然后通常就解决了这个问题。 例如:
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