27. 直接修改输入文件
如您所知,sed 默认情况下不会修改输入文件。 sed 将输出写入标准输出。 当您想将其存储在文件中时,可以将其重定向到文件(或使用 w
命令)。
在继续此示例之前,请备份 employee.txt
:
cp employee.txt employee.txt.orig
要直接对输入文件进行修改,通常将输出重定向到临时文件,然后将该临时文件重命名为新文件。
sed 's/John/Johnny/' employee.txt > new-employee.txt
mv new-employee.txt employee.txt
相反,您可以使用 sed 命令行选项 -i
,它允许 sed 直接修改输入文件。
在原始的 employee.txt
文件中将 John
替换为 Johnny
:
$ sed -i 's/John/Johnny/' employee.txt
$ cat employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
再次请注意 -i
修改输入文件。 有时您可能会想要这样做,但要非常小心。
为了安全,您可以做的一件事是在使用 -i
时添加文件扩展名。 Sed 在写入新内容之前会备份原始文件。
在原始 employee.txt
文件中将 John
替换为 Johnny
,但保存备份副本:
$ sed -ibak 's/John/Johnny/' employee.txt
这将备份原始文件,如下所示。
$ cat employee.txtbak
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
原始输入文件已被上述 sed 命令修改。
$ cat employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
除了 -i
之外,您还可以使用更长的形式 --in-place
。 以下两个命令是等效的。
sed -ibak 's/John/Johnny/' employee.txt
sed --in-place=bak 's/John/Johnny/' employee.txt
最后,恢复原始的 employee.txt
文件,因为我们在其余示例中需要该文件:
cp employee.txt.orig employee.txt