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岁,斯坦福大学