文本三剑客之sed

sed是一个流编辑器(sed是stream editor的缩写),它可以对从标准输入流中得到的数据进行处理,然后把处理以后得到的结果输出到标准输出,而标准输出通常会关联到终端屏幕,因此处理后的结果也会显示到屏幕上。当然,也可以把标准输出重定向到文件,这样处理后的结果就会保存在磁盘文件中。

格式:

sed    [OPTION]    ‘/pattern/action’    FILE1,FILE2…

可看出sed同样可以同时处理多个文件

注意:

sed只会对流经它的数据流进行处理和编辑,而不会对原始文件做任何修改,这就意味着sed要处理的数据并不一定非要是磁盘上的文件,也可以是其他进程的数据输出

Sed获取数据流的两种方式:管道和文件

sed命令执行时,它会从输入文件(或标准输入数据流中)每次读取一行数据,并把这行数据复制一份保存在它内部的(缓存)模式空间中(也即是说sed每次按行处理数据,每次处理1)。

所有的数据都是在这个缓存中被处理的,然后sed命令会根据指定的编辑命令对缓存中的数据进行处理。当这行数据处理完以后,sed命令会读取下一行数据,重复整个过程,直到所有的数据被处理完为止

sed命令的主要特性:

使用相同的一系列操作重复地处理文件中的每一行文本,当文件中的所有行都被sed命令处理完以后,文件被关闭,然后sed命令退出。

 

Pattern说明:

pattern是一个正则表达式pattern两侧的斜杠/作为分隔符限定了正则表达式的起始和结束的位置通过这个正则表达式可以匹配要操作的是文件(或数据)中的行,只有正则表达式pattern匹配的行,sed命令才会在模式空间中对它进行处理。

如果不写正则表达式/pattern/,意思是sed命令会对输入数据的所有行都会一行一行的执行action操作

/pattern/:选择(匹配)操作的行

可以理解为地址,所谓地址就是文本文件的行号正则,要么是一个文件中的特定行,要么是一个范围。如果在编辑命令中没有指定地址,则sed命令会对每一行都执行编辑操作

sed中进行输出时包含指定地址的两端的行常用形式如下:

1sed    -n    ‘3p’     /etc/passwd

2sed    -n    ‘3,10p’     /etc/passwd

注意:指定一个地址范围时,起始行的行号总是应该小于结束行的行号,否则仅会输出行号最大的一行,如:sed  -n  ‘263p’  /etc/passwd    #仅会输出第26

3sed    -n    ‘3+10p’    /etc/passwd            #输出第3行,及后面的10

4sed    -n    ‘326p’    /etc/passwd            #输出3~26行之外的所有行

5sed    -n    ‘1~2p’    /etc/passwd                #输出所有奇数行(~2表示步长增量)

6sed    -n    ‘/root/p’    /etc/passwd              #输出包含root的行

7sed    -n   ‘2/root/p’    /etc/passwd           #行号和正则混合,仅匹配第一个遇到正则

8sed    -n   ‘/root/,/root/p’    /etc/passwd 

#假设该文件中有很多个root行,则会按照如下方式输出:

第1个包含root的行和第2个包含root的行之间的所有内容,

第2个包含root的行和第3个包含root的行之间的内容不输出

输出第3个包含root的行和第4个包含root的行之间的所有内容,

第4个包含root的行和第5个包含root的行之间的内容不输出

输出第5个包含root的行和第6个包含root的行之间的所有内容,

action的说明

action是对正则表达式pattern过滤出来的行进行处理的动作

a             在指定行的后面添加一行或多行文本

       sed  '3a ddtest'  boy.log             #增加1行

       sed  '3a ddtest\n123'  boy.log     #增加2行

i             i\ 在指定行的前面插入文本          #插入1行或多行用法同a

c             用新行替换指定的行

d            删除指定的行                     #功能

=            输出每个匹配行的行号(注意仅输出行号,不输出对应行的内容)

h            把模式空间里的内容复制到暂存缓存区

H            把模式空间里的内容追加到暂存缓存区

g            取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容

G            取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面        #这4个选项不常用

l             列出非打印字符

n            读入下一输入行,并从下一条命令而不是第一条命令开始处理

p            打印处理的行              

r  FILE         从文件中读取输入行

w  FILE       将匹配行写出到文件

s             替换                            #改功能                      #sed最为重要的功能

与s动作搭配使用的替换标志(默认只会替换一行中的第一个匹配字符,除非指定g)

Ii 忽略大小写

NUM  仅对第NUM个匹配进行替换

g 在行内进行全局替换

p 匹配成功打印模式空间

w  FILE  匹配成功将结果写入文件FILE

x  交换暂存缓冲区与模式空间的内容

y  将字符转换为另一字符(不能对正则表达式使用y 命令)

&代表被替换的内容

用法如下:

 

后面的&就等同于am

动作s替换的用法:

/pattern/s/string1/string2/替换标记              #将string1替换为string2

后面的s/string1/string2/分隔不一定要使用/,可以使用其它任何字符,sed会将s后的第一个字符作为分隔符

选项Option:

-n           限制仅输出被处理的行,而不是将读取到模式空间中的所有行全部输出

--silent、--quiet这两个选项等同于-n

-r            支持使用扩展正则表达式

-i            默认sed仅会更改显示的内容,不会更改实际文件,该项将会更改文件的实际内容

多个匹配处理:3种方式

-e  ‘/pattern/action’   -e  ‘/pattern/action …’           #-e选项指定多个匹配,grep也有这种用法

-f  script-file                               #-e类似,只是将多个pattern写入到文件中(每行一个匹配)

‘/pattern/action; /pattern/action; /pattern/action…’          #使用分号指定多个匹配

注意:

1最后一种分号;指定,两条命令的执行是有前后顺序的,第二条命令不会在第一条之前执行,并且它接收到的数据总是第一条命令处理以后的结果

2、如果想指定两个独立的编辑命令,分别为两个编辑命令指定选项-e

3、在-f后接的文件中。可以像在Shell脚本中一样添加注释,在要注释的行前面添加字符#,从字符#到下一个换行符之间的全部内容都会被认为是注释,不会被匹配

猜你喜欢

转载自www.cnblogs.com/liliyang/p/9313903.html