sed工具

来源:互联网 发布:ubuntu 配置openstack 编辑:程序博客网 时间:2024/06/06 17:53

一、概念
1、含义:
sed意为流编辑器,在shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。因为sed和vi都源于早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。

2、工作方式:
Sed是一种线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后把缓冲区的内容送往屏幕。然后再处理下一行,这样不断反复,直到文件末尾。这时文件内容并没有改变,除非你使用重定向存储输出。
其处理过程如下图所示:
这里写图片描述

3、作用:
Sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,sed默认按照basic规范基本匹配!

二、命令格式:
1、sed option ‘script’ file1 file2 …
2、sed option -f scriptfile file1 file2 …
释:sed处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,命令行参数可以一次传入多个文件,sed会依次处理。Sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文件,然后用-f参数指定,编辑命令的格式为:/pattern/action。其中,pattern表示正则表达式,action表示编辑操作。Sed程序会一行一行地读取待处理文件,如果某一行与pattern匹配,则执行相应的action;如果一条命令没有pattern,而只有action,那么这个action将作用于待处理文件的每一行。

三、/pattern/action编辑命令格式
1、/pattern/p:打印匹配pattern行
使用p命令需要注意:sed是把待处理文件的内容连同处理结果一起输出到标准输出的,因此p命令表示除了把文件内容打印出来之外还额外打印一遍匹配pattern的行。
【例】
这里写图片描述
注意:要想值输出处理结果,应加上-n选项,这种用法相当于grep命令。

2、/pattern/d:删除匹配pattern的行
【例】
这里写图片描述

注意:sed命令不会修改原文件,删除命令值表示某些行不打印输出,而不是从原文件中删去。如果加上“-i”参数将直接修改文件内容。

3、/pattern/s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2。其实,就是字符串替换,即:用一个字符串替换另外一个字符串。格式为”/行范围/s/旧字符串/新字符串/g”(如果不加g的话,则表示只替换每行第一个匹配的串)。
【例】
这里写图片描述

4、定址
定址用于决定哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
【例1】打印第三行
这里写图片描述

【例2】删除第二行到第五行
这里写图片描述

【例3】删除包含‘3’和‘4’之间的行。
这里写图片描述

【例4】删除文件file中的第三行到包含4之间的行。
这里写图片描述

【例5】删除第三行到最后一行。
这里写图片描述

注意:地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内),范围可以用数字、正则表达式或二者的组合表示。

四、命令和选项
sed命令告诉sed如何处理由地址指定操作各输入行,如果没有指定地址则处理所有的输入行。
1、命令:
(1)a\:在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行。
(2)c\:用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需要“\”续行。
(3)i\:在当前行之前插入文本。多行时除了最后一行外,每行末尾需用“\”续行d删除行。
(4)h:把模式空间里的内容复制到暂存缓冲区。
(5)H:把模式空间里的内容追加到暂存缓冲区。
(6)g:把暂存缓冲区里的内容复制到模式空间,覆盖原有内容。
(7)G:把暂存缓冲区里的内容追加到模式空间,追加到原有内容的后面。
(8)l:列出非打印字符。
(9)p:打印行。
(10)q:结束或退出sed。
(11)r:从文件中读取输入行。
(12)!:对所选行以外的所有行应用命令。
(13)s:用一个字符替换另一个字符。
(14)g:在行内进行全局替换。
(15)x:将所选的行写入文件。
(16)y:将字符替换为另一个字符(不能对正则表达式使用y命令)。

2、选项:
(1)-e:进行多行编辑,即对输入行应用多条sed命令时使用。
(2)-n:取消默认的输出。
(3)-f:指定shell脚本的文件名。

五、退出状态
sed不像grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。

原创粉丝点击