• 本页内容

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