文本处理工具sed
1、sed介绍
Sed是一种非交互式的流编辑器,通过多种转换修改流经过它的文本。但是,默认情况下,sed并不改变原文件本身,而只是对流经sed命令的文本进行修改,并将修改后的结果打印到屏幕上。Sed处理文本时是以行为单位的,每处理一行就立即打印出来,然后在处理下一行,直至全文处理结束。
Sed可做的编辑动作包括删除、查找替换、添加、插入、从其他文件中读入数据等,如果想对修改后的流文件进行保存更改,则需要使用重定向对修改后输出的内容进行保存
Sed的用法:sed [options] ‘command’ file
#options是sed可以接受的参数
#command是sed的命令集(一共25个)
#使用-e参数和分号连接多编辑命令,如下面例子:
在上面的例子中,我们使用-e参数,将this字符串修改为that,将line修改为LINE,此处便使用了-e参数,上面的命令也可以使用下面的分号来代替:
在使用分号对命令进行分段处理时,注意格式。
2、删除
可以使用sed命令对文件进行自定义删除,如下:删除文件中的第一行内容:
上述的删除指定行进行输出时,对原文件不做修改,如果我们要对原文件进行修改,则需要使用重定向。
如果不想使用重定向,那么使用 -i 参数也可以仅对原文件进行修改,并且不将修改后的内容进行打印输出:
删除指定范围的行:删除第一行到第三行
删除第一行到最后一行:此时因为文件中的内容都被删除,所以不会有任何输出
删除最后一行:
删除多与行,只保留指定行:只保留第5行:
删除包含指定字符串的行:
删除空行:注意此处的空行书写格式
3、查找替换
使用s命令可将查找到的匹配文本内容内容替换为新的文本,如下例:
上图中,将文本中所有的this字符串替换为that,下图将替换文本中开头的this为that
注意:如果一行中出现多个相同的字符串,如果不加g命令,则该命令默认只替换第一个出现的字符串,后面的不做修改,g命令表示全文中的匹配项进行替换,如下图中的实例:
4、字符替换
使用y 命令可进行字符转换,其作用为将一系列字符逐个变换为另一系列的字符,但是需要注意的是,转换字符的长度要和被转换字符的长度相等,否则sed无法执行。
如上图,当需要替换的字符长度相等时,则替换成功,如果替换字符长度不等时,则会报错。
5、插入文本
使用 i 或者 a 命令插入文本,其中 i 代表在匹配行之前插入,而 a 代表在匹配行之后插入。
同样,我们也可以在特定的字符所在行前(后)插入指定的数据:
6、读入文本
使用 r 命令可从其他文件中读取文本,并插入匹配行之后。
上面的实例将insert.txt中的文本内容插入到空行之后。
7、打印
使用 p 命令可进行打印,这里使用sed命令时一定要加-n参数,表示不打印没关系的行。因为sed命令是逐行进行操作的,所以我们在进行匹配修改的时候可以删除不必要的行,此时就需要-n的参数。
打印文件中指定的行:
我们可以看到,在上面的输出打印中,与删除命令相当接近:
清读者仔细观察上图中两个不同命令打印结果的区别,p命令是逐行进行操作,如果遇到匹配成功的行,则进行操作后直接进行输出打印,也就是所会打印两次,而没有p命令的打印结果则只会输出一次匹配结果,所以,我们在使用p命令的时候需要配合-n参数,来将无关的行清除:
8、写文件
Sed本身默认不修改原文件,而只是对缓冲区的文本做了修改并输出到屏幕,所以想保存修改后的文件,除了使用重定向和-i参数之外,还可以使用w命令将结果保存到指定文件。
9、高级替换
上面介绍的是一些基础简单的sed操作,但在实际的操作环境中,并没有上述的那么简单,需要我们结合使用来对文本进行修改。例如:
替换匹配行的下一行,这时我们就需要n命令:将sed.txt文本中空行的下一行中line替换为LINE
将模式空间的内容放入存储空间以便于接下来的编辑:
实现该功能,就需要使用H/h/G/g这几个命令了
模式空间:当前输入行的缓冲区
存储空间:模式空间以外的一个预留缓冲区
H:将模式空间的内容追加到存储空间
h:将模式空间的内容复制到存储空间,覆盖原有的存储空间
G:将存储空间的内容追加到模式空间
g:将存储空间的内容复制到模式空间。
下图中的例子为,将第一行与第二行进行反转,以及第三行和第四行进行反转。
10、sed脚本
我们可以编写一些sed脚本来定时对一些文件进行分析操作,以达到我们的自动化操作,我们可以把一些sed命令写进一个文件,然后使用-f命令来使用这个文件,以达到我们的目的,这个文件就是sed脚本。以下即为实例,注意,sed脚本文件可以自定义。