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.twle.cn]$ sed -n 'w data.bak.txt' data.txt
运行上面的命令,嗯,什么都没输出
但在当前目录下则多出了一个 data.bak.txt
文件,内容和 data.txt
一模一样。
[www.twle.cn]$ cat data.bak.txt 1) 小明,23岁,北京大学 2) 小红,22岁,清华大学 3) 小李,25岁,斯坦福大学 4) 小王,22岁,清华大学
我们可以使用 diff
命令查看两个文件的差异
[www.twle.cn]$ diff data.bak.txt data.txt
然后使用下面的命令查看前一个命令的输出结果
[www.twle.cn]$ echo $? 0
会发现没有输出 0
,也就是两个文件一模一样。
从上面的输出结果来看,w file
命令简直就是 cp
命令的翻版。
范例2: 只写入指定的行
我们还可以使用从前面章节中学习到的 行寻址 语法,比如使用 ~
来实现隔行写文件。
例如下面的 sed 命令,从第 1 行开始,每隔 2 行写入文件 data.1.txt
中
[www.twle.cn]$ sed -n '2~2 w data.1.txt' data.txt
我们使用 cat data.1.txt
输出下命令运行的结果看看
2) 小红,22岁,清华大学 4) 小王,22岁,清华大学
除了 ~
符号外,我们还可以使用 逗号(,
)、加号(+
)、美元符号($
) 等等字符。
范例3: 写入匹配模式的行
除了支持 行号寻址 外,sed 写命令还支持 模式寻址,也就是支持将匹配模式的行写入到文件中。
例如下面的命令将包含了 明
的行写入到文件 data.2.txt
文件中
[www.twle.cn]$ sed -n '/明/ w data.2.txt' data.txt
打开 data.2.txt
我们可以看到内容如下
1) 小明,23岁,北京大学
范例4: 不同模式写入不同文件
我们还可以使用 -e
选项来运行多个 sed 命令,将不同的模式写入不同的文件中。
例如下面的命令将包含 红
的行写入 data.3.txt
,将包含 李
的行写入 data.4.txt
[www.twle.cn]$ sed -n -e '/红/ w data.3.txt' -e '/李/ w data.4.txt' data.txt
打开文件 data.3.txt
我们可以看到输出内容如下
2) 小红,22岁,清华大学
打开文件 data.4.txt
我们可以看到输出内容如下
3) 小李,25岁,斯坦福大学