读和写文件编辑命令
读文件编辑命令(r)和写文件编辑命令(w)用于直接处理文件,语法如下:
[line-address]r file
[address]w file
读文件编辑命令和文件名之间必须有空格,如果文件不存在,读文件命令不会报错,写文件命令将创建一个文件,如果文件已经存在,将会被改写。
使用读文件命令对于将一个文件的内容插入到另一个文件的特定位置是很有用的,比如在所有 txt文件尾部插入一个内容,语句如下:
sed -i '$r file' *.txt
其中file中是一些要插入的文本内容(可以使另一个文件)。字符”$”是指定文件最后一行的寻址符号 ,下面看一个示例:
#要修改文本内容at.txt
<html>
<body>
<tag>
</tag>
</body>
</html>
#要添加的文本内容sed.txt
This is a test line.
Hello World!
#sed读文件命令,含义是当sed匹配到以字符串<tag>开始的行时,将文件sed.txt的内容附件在被匹配的行的末尾。
/^<tag>/r sed.txt
#针对文件at.txt执行该指令
[root@test ~]# sed '/^<tag>/r sed.txt' at.txt
<html>
<body>
<tag>
This is a test line.
Hello World!
</tag>
</body>
</html>
可以看到tag标签后面添加了我们要添加的内容。
需要注意,如果上面的指令/^<tag>/r sed.txt还有其他指令,那么后续指令不能对从文件sed.txt中读取的内容做任何改变,比如如果我们在指令后面还有一句,删除以Hello开头的一行(我们可以看到sed.txt中有这么一行),但是这个指令不会对从sed.txt中读取出来的内容有任何改变,也就是最终输出还是上面那样,Hello World那一行不会被删除,如下,我们保持刚才的sed.txt和at.txt不变,但是将sed指令改为使用sedtest.txt。
#使用如下sedtest.txt代替刚才的sed指令/^<tag>/r sed.txt,其实就是在后面追加了一句删除Hello World!行的指令
/^<tag>/r sed.txt
/Hello World!/d
#执行指令
[root@test ~]# sed -f sedtest.txt at.txt
<html>
<body>
<tag>
This is a test line.
Hello World!
</tag>
</body>
</html>
可以看到上面的内容并没有变化,因为虽然sed指令中有一行删除Hello World!行的指令,但是对我们读取的文件内容(sed.txt)不会起作用,这一点演示了读文件后面的编辑命令不会影响读文件命令从文件中读取的行。
使用-n选项或#n脚本语法可以取消抑制自动输出,阻止模式空间的初始行被输出,但是读命令的结果仍然会转到标准输出。
下面看一个写文件编辑命令的例子,这个例子的目标是将原文件中的四家公司按照国家分类写到不同的文件中:
#要读取的原文件,分别是四家公司,两家美国公司,两家中国公司
DIDI CHINA
TENCENT CHINA
APPLE USA
GOOGLE USA
#sed脚本,将四家公司分类并写到对应的文件中
/CHINA/w CHINA.txt
/USA/w USA.txt
#现在针对源文件执行sed脚本
[root@test ~]# sed -f sed.txt at.txt
DIDI CHINA
TENCENT CHINA
APPLE USA
GOOGLE USA
[root@test ~]# ll 可以看到多了两个文件CHINA.txt和USA.txt
total 1369068
...
-rw-r--r--. 1 root root 25 Aug 28 10:10 CHINA.txt
-rw-r--r--. 1 root root 21 Aug 28 10:10 USA.txt
[root@test ~]# cat CHINA.txt
DIDI CHINA
TENCENT CHINA
[root@test ~]# cat USA.txt
APPLE USA
GOOGLE USA
写文件命令在被调用时就写出模式空间的内容,而不是等到到达脚本的结尾时才进行写操作。
假如我们想在写入文件之前去掉后面的国家,可以对上面的sed.txt做如下改动:
#sed.txt 匹配与地址相同的模式并删除
/CHINA$/{
s///
w CHINA.txt
}
/USA$/{
S///
w USA.txt
}
#执行新的脚本
[root@test ~]# sed -f sed.txt at.txt
DIDI
TENCENT
APPLE
GOOGLE
[root@test ~]# cat CHINA.txt
DIDI
TENCENT
[root@test ~]# cat USA.txt
APPLE
GOOGLE
|