如何获得sed命令对文件进行永久更改?


32

这可能吗?我在某处读到以下命令可以做到这一点:

sed -e [命令] [文件]

但它似乎和

sed [命令] [文件]

(它没有保存更改)。有什么办法可以使用sed做到这一点?


2
-e标志代表表达。您可能想要-i标志,in-place我强烈建议您使用 sed -i.bak 's/../' filename
Valentin Bajrami 2013年

Answers:


50

我认为您正在寻找-i

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

          edit files in place (makes backup if SUFFIX supplied)

例如:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

如果提供后缀,它将创建一个备份文件:

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

修改输入文件,并创建包含原始文件数据的备份。

另请注意,这是针对GNU的sed,不同实现之间的格式略有不同sed


4
请注意手册页是错误的。sed不进行就地编辑。它创建一个新文件并覆盖旧文件,inode更改。
Marco Marco

2
@Marco这是就地编辑文件的安全方法。sed文档中的“就地编辑文件”表示修改了原始文件(按其名称定义),而不是修改了原始文件(按其inode定义)。
吉尔(Gilles)'所以

2
@Gilles我完全同意这是编辑文件的首选方式,但是我很难将其称为就地。但这归结为如何通过索引节点或名称来标识文件的问题。我要用inode来表示,否则类似的构造{ rm file; cmd > file; } < file将得出这样的结论,即cmd可以读写同一文件,而事实并非如此。这是两个不同的文件,它们恰好具有相同的名称。但我不想在这里开始讨论。
Marco Marco

在macOS 10.14上,我可以sed: 1: "foo.txt": invalid command code f运行sed -i 's/o/X/g' foo.txt。但是,提供扩展名也sed -i .bak 's/o/X/g' foo.txt可以。有什么想法如何使它工作而不创建备份文件吗?
约书亚·品特

1
好,知道了 在macOS中,您需要为扩展名param选项显式添加一个空字符串:sed -i '' 's/o/X/g' foo.txt
Joshua Pinter

2

这些解决方案适用于HPUX(UNIX):

1。 { rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > test1.sh; } < test1.sh

2。 perl -pi -e 's/Error/NO_Error/g' test1.sh

3。 sed 's/Error/NO_Error/g' test1.sh | tee test1.sh


您不能使用tee askubuntu.com/a/752451
Steven Penny

1

-e选项用于执行多个sed命令

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

考虑file.txt

linux os

那么O / P是

unix os

-i 选项永久保存更改...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.