Sed流编辑工具(大多数以行为操作单位来定位)

Sed默认不直接修改源文件而是通过管道或者文件读取内容将其复制到称之为模式空间的缓冲区,其指令在这个模式空间内完成并打印到屏幕上。

语法格式:

上面提到定位以行尾单位,那么行暂且定义它为地址,也就是操作对象

地址的范围有一下集中格式

n#指定唯一行号

1~2 #指定从1行开始,间隔为2也就是1,3,,5,以次类推

$#指定最后一行

/正则表达式/#匹配正则表达式的操作对象

\a正则表达式a#匹配\a和a之间的正则表达式

3,5#匹配3-5行

1,+10#匹配1和1后面的10行内容

Sed[选项][脚本指令][输入文件]

选项:-n#静默输出,不打印模式空间的内容,默认情况下是自动打印的

-e脚本#允许多个脚本指令被执行

-f#从文件中读取指令

-l#输出的行长度

-r#扩展正则表达式

-I#直接修改源文件

指令:a   (append)#追加

d (delete)#删除

s(substitution)#替换

c#更改

y#按字符替换

p#打印

q#退出

i#插入

l#打印(显示非打印字符)

L#打印(显示打印字符)

r#读入文件内容

例:第一行后追加"This is a example"


[root@pan-S ~]# sed "1a This is a example" /opt/fstab_Mrpan


例:第6行前追加"This is a example"#注意源文件发生改变了


[root@pan-S ~]# sed -i "6i This is a example" /opt/fstab_Mrpan

例:替换命令

[root@pan-S ~]# sed "s/defaults/Mr.pan/g" /opt/fstab_Mrpan


[root@pan-S ~]# sed -i "3s/fstab/fstab_Mr.pan/g" /opt/fstab_Mrpan

例:更改命令

[root@pan-S ~]# sed "/pan/c exit" /etc/passwd | more

例:利用正则表达式

匹配包含fstab的行单位

[root@pan-S ~]# sed -i "/fstab/a This is a example" /opt/fstab_Mrpan

[root@pan-S ~]# sed -n "/^$/d" /opt/fstab_Mrpan

当需要执行多个指令时可以使用 e f 或者分隔符分号;还可以使用分行,但是最好使用-f 文件来执行,这样的话便于修改,不容易出错。

例:删除包含example的行,替换所有的0为1

(1)、[root@pan-S ~]# sed -e "/example/d" -e "s/0/1/g" /opt/fstab_Mrpan

(2)、[root@pan-S ~]# sed "/example/d;s/0/1/g" /opt/fstab_Mrpan

(3)、如下图所示:

(4)、编写一个文件

例:文件内容如下



这里做个sed 格式的总结:

[匹配行]{

命令1

命令2

命令3

}

例:删除文件中的空格

第一步:创建空格环境

[root@Mr ~]# cat /etc/group >> sed_d2_example

[root@Mr ~]# sed G  /sed_d2_example i

第二步:编写文件 vim sed.sh 如下所示

第三步:[root@Mr ~]# sed -f ./sed.sh ./sed_d2_example i#删除空格


例:匹配行上插入空行

[root@Mr ~]# sed "/sshd/{x;p;x;}" /etc/group

例:匹配行下插入空行

[root@Mr ~]# sed "/sshd/G" /etc/group

例;匹配行上下各插入空行

    [root@Mr ~]# sed"/sshd/{x;p;x;G;}" /etc/group

 

例:将小写装换成大写

       (1)、单词转换为大写(sed)

       [root@Mr ~]#sed "s/\bmysql\b/\U&\E/g" sed_d2_example

       (2)、全文转换为大写(sed)

       [root@Mr ~]#sed "s/[a-z]/\U&\E/g" sed_d2_example

       (2.1)、全文转换为大写(tr)

       [root@Mr ~]#cat sed_d2_example | tr [a-z] [A-Z]

例:先读取/etc/group 再读取/etc/passwd文件

       [root@Mr ~]#vim r_sed.sh

       #先读取/etc/group 再读取/etc/passwd

       /.*/{

       $r /etc/passwd

        }
       

[root@Mr ~]# sed -f r_sed.sh /etc/group

例:q指令

    显示/etc/passwd 前两行之后推出

    [root@Mr ~]# sed'2q' /etc/passwd

  root:x:0:0:root:/root:/bin/bash

  bin:x:1:1:bin:/bin:/sbin/nologin

  [root@Mr ~]#

Sed高级应用

    Next 多行操作

    [root@Mr ~]# vim N_sed.sh  #n用来屏蔽自动输出 L不显示非打印字符\n(换行符)

    #n

    #多行操作Next

    /name/{

    N

    L

    }

    

解析:sed使用了N读取了下一行的内容,同时又指令使其显示模式空间的内容这时输出的是两行合并的内容,如下所示,同时#n屏蔽了自动输出的内容仅显示L列出的模式空间的内容

[root@Mr ~]# sed-f N_sed.sh test.txt

name:shudaipiaolingage:10

name:Mrpan age:20

name:pan age:30

区别上例:

  #n

 #多行操作NEXT使用l指令显示非打印字符,这个与L不显示非打印字符的区别

  /name{

    N

    l

}
   

[root@Mr ~]# sed-f N_sed.sh_l test.txt

name:shudaipiaoling\nage:10$

name:Mrpan\nage:20$

name:pan\nage:30$

Print 多行打印 #注意观察两个p P的区别,

wKioL1XEXuLDH2aCAADlsdRKg3Y033.jpg

解析:指令P的sed使用N读取下一行内容追加到行尾为name:shudaipiaoling\nage:10,而P的特点是输出多行模式空间中第一部分的内容,直到\n换行符为止,此时指令P打印出来的内容为name:shudaipiaoling,而后sed自动输出内容模式空间的内容且\n输出为换行,即打印第一行2次,第二行一次。

 

模式空间和保持空间的内容相互复制

保持空间是sed中的另外一个缓冲区,此缓冲区正如其名,不会自动清空,但也不会主动把此缓冲区中的内容打印到标准输出中。而是需要以下sed命令进行处理:(下面所说的复制按替换的意思理解)

     d     Delete pattern space.  Start next cycle.   删除pattern space的内容,开始下一个循环.

     h、 H    Copy/append patternspace to hold space.   复制/追加pattern space的内容到hold space.

     g、 G    Copy/append holdspace to pattern space.   复制/追加hold space的内容到pattern space.

     x      Exchange the contents of the hold and patternspaces.    交换hold space和pattern space的内容.

sed的工作流程。pattern spacehold space默认都是空的。sed读入一行内容,删除尾部的换行符,存入pattern space, 然后执行SCRIPT,如果OPTIONS里没有 -n, pattern space里的内容会被输出到stdout(若读入时含有换行,这里会输出换行), 如果有-n, 则不输出,接下来就读取下一行数据,重复上述步骤。

例:


[root@Mr ~]# cattest.txt

name:shudaipiaolingage:10

name:Mrpan age:20

name:pan age:30

[root@Mr ~]#

[root@Mr ~]# sed'1!G;h;$!d' test.txt

name:pan age:30

name:Mrpan age:20

name:shudaipiaolingage:10

wKiom1XEXU3Q7ds9AAIOxRxXXJ0025.jpg

<span