11、sed 写文件命令 w

sed支持 写文件 命令。命令为单字母 w ,是 write 的缩写。

一开始我还在想,写文件命令到底是什么鬼?

看完sed 所有的官方手册后,我才恍然大悟,原来写命令是这样的啊。

sed 写文件命令 w

sed 写文件命令 到底是什么鬼呢?

嗯,呃,简单来说,sed 写文件命令就是支持将某行或某范围的行写入到另一个文件中。

因为可以写入到另一个文件中,因此 写文件 命令看成是对源文件的一种副本或备份。

sed 写文件命令 w 语法

sed提供 write 命令用于将模式缓冲区的内容存储在另一文件中。

write 命令的语法和我们前面学习的 delete 命令的语法格式简直一模一样

[address1[,address2]]w file

  • file 是目标文件路径,也就是内容要备份/拷贝到的目标文件地址。
  • address1 和 address2 分别是 起始地址结束地址,可以是 行号模式字符串
  • address1 和 address2 都是可选参数,可以都不填,这时候就是全文件拷本/备份了。
  • 如果存在一个,那么就是备份 单行。也就是只备份 address1 指定的那行。

从语法格式上来看,write 命令和 delete 命令的唯一差别,就是 write 命令有多了一个 file 参数。

注意

  • 如果 file 参数指定的文件不存在,sed 会新建文件。
  • 如果 file 参数指定的文件已经存在,sed 会删除原内容。

范例1: 制作文件副本

如果我们仅仅使用 w file 参数,那么就是制作源文件的一个副本。

例如下面的命令,我们制作源文件 data.txt 的一个副本,并将它命令为 data.bak.txt

[www.ddkk.com]$ sed -n 'w data.bak.txt' data.txt

运行上面的命令,嗯,什么都没输出

但在当前目录下则多出了一个 data.bak.txt 文件,内容和 data.txt 一模一样。

[www.ddkk.com]$ cat data.bak.txt 
1) 小明,23岁,北京大学
2) 小红,22岁,清华大学
3) 小李,25岁,斯坦福大学
4) 小王,22岁,清华大学

我们可以使用 diff 命令查看两个文件的差异

[www.ddkk.com]$ diff data.bak.txt data.txt

然后使用下面的命令查看前一个命令的输出结果

[www.ddkk.com]$ echo $?
0

会发现没有输出 0,也就是两个文件一模一样。

从上面的输出结果来看,w file 命令简直就是 cp 命令的翻版。

范例2: 只写入指定的行

我们还可以使用从前面章节中学习到的 行寻址 语法,比如使用 ~ 来实现隔行写文件。

例如下面的 sed 命令,从第 1 行开始,每隔 2 行写入文件 data.1.txt 中

[www.ddkk.com]$ sed -n '2~2 w data.1.txt' data.txt

我们使用 cat data.1.txt 输出下命令运行的结果看看

2) 小红,22岁,清华大学
4) 小王,22岁,清华大学

除了~ 符号外,我们还可以使用 逗号(,)加号(+)美元符号( $ 等等字符。

范例3: 写入匹配模式的行

除了支持 行号寻址 外,sed 写命令还支持 模式寻址,也就是支持将匹配模式的行写入到文件中。

例如下面的命令将包含了 明 的行写入到文件 data.2.txt 文件中

[www.ddkk.com]$ sed -n '/明/ w data.2.txt' data.txt

打开data.2.txt 我们可以看到内容如下

1) 小明,23岁,北京大学

范例4: 不同模式写入不同文件

我们还可以使用 -e 选项来运行多个 sed 命令,将不同的模式写入不同的文件中。

例如下面的命令将包含 红 的行写入 data.3.txt,将包含 李 的行写入 data.4.txt

[www.ddkk.com]$ sed -n -e '/红/ w data.3.txt' -e '/李/ w data.4.txt' data.txt

打开文件 data.3.txt 我们可以看到输出内容如下

2) 小红,22岁,清华大学

打开文件 data.4.txt 我们可以看到输出内容如下

3) 小李,25岁,斯坦福大学