引 入        


       sed文本处理三剑客之一(grep,sed,awk),主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面来简单介绍一下sed。

 

 

一、sed工作原理:


 

sed原理与用法详解_基本

sed处理文件流程:

1、一行一行地,把读取到的文件copy到sed自己的工作车间中,即模式空间中。

2、在模式空间中判断这一行是否被相关条件所匹配。

        匹配到的,做相关的编辑处理,然后输出。

        匹配不到的,默认标准输出。

注意:除了模式空间,sed还有另外一个内存处理空间,我们称为保持空间,这两个空间的内容可以有交互,不过我们一般很少用到。

 

二、sed用法:


 

sed [OPTION]...  'script'  [input-file] ...

    script:

    地址定界编辑命令

 

    常用选项:

        -n:不输出模式空间中的内容至屏幕;默认是输出的。

        -e script, --expression=script:多点编辑;

        -f  /PATH/TO/SED_SCRIPT_FILE

            每行一个编辑命令;

        -r, --regexp-extended:支持使用扩展正则表达式;

        -i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;危险行为,慎用

 

 

 

    地址定界:

        (1) 空地址:对全文进行处理;

        (2) 单地址:

            #:指定行;

            /pattern/:被此模式所匹配到的每一行;

        (3) 地址范围

            #,#:

            #,+#:

            #,/pat1/

            /pat1/,/pat2/

            $:最后一行;

        (4) 步进:~

            1~2:所有奇数行

            2~2:所有偶数行

 

    编辑命令:

        d:删除;

        p:显示定界选定的模式空间中的内容;

        a  \text:在行后面追加文本“text”,支持使用\n实现多行追加; 

        i  \text:在行前面插入文本“text”,支持使用\n实现多行插入; 

        c  \text:把匹配到的行替换为此处指定的文本“text”;

        w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;

        r  /PATH/FROM/SOMEFILE:读取指定文件内容至当前文件被模式匹配到的行后面;文件合并;

        =:为模式匹配到的行打印行号;

        !:条件取反;

            用法:地址定界!编辑命令;

        s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;

                替换标记:

                    g:全局替换;

                    w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;

                    p:显示替换成功的行;

 

 

三、sed实例:


 

 

文件:sedTest.txt

northwest NW Charles Main 3.0 .98 3 34

western WE Sharon Gray 5.3 .97 5 23

southwest SW Lewis Dalsass 2.7 .8 2 18

southern SO Suan Chin 5.1 .95 4 15

southeast SE Patricia Hemenway 4.0 .7 4 17

eastern EA TB Savage 4.4 .84 5 20

northeast NE AM Main Jr. 5.1 .94 3 13

north NO Margot Weber 4.5 .89 5 9

central CT Ann Stephens 5.7 .94 5 13

 

1)找到以north开头的行并在其后添加很多FUCK

[root@node1 tmp]# sed '/^north/a\FUCK' sedTest.txt
northwest NW Charles Main 3.0 .98 3 34
FUCK
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
FUCK
north NO Margot Weber 4.5 .89 5 9
FUCK
central CT Ann Stephens 5.7 .94 5 13
[root@node1 tmp]#

2)把有south的行全部用FUCK取代   

[root@node1 tmp]# sed '/south/c\FUCK' sedTest.txt
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
FUCK
FUCK
FUCK
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
[root@node1 tmp]#

3)删除1-4行  

[root@node1 tmp]#  sed '1,4d' sedTest.txt
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
[root@node1 tmp]#

4)寻找大于1少于10的一位小数并用FUCK+&替代。这里的&保存了前面的小数

[root@node1 tmp]# sed  's/[0-9]\.[0-9]/FUCK&/g' sedTest.txt 
northwest NW Charles Main FUCK3.0 .98 3 34
western WE Sharon Gray FUCK5.3 .97 5 23
southwest SW Lewis Dalsass FUCK2.7 .8 2 18
southern SO Suan Chin FUCK5.1 .95 4 15
southeast SE Patricia Hemenway FUCK4.0 .7 4 17
eastern EA TB Savage FUCK4.4 .84 5 20
northeast NE AM Main Jr. FUCK5.1 .94 3 13
north NO Margot Weber FUCK4.5 .89 5 9
central CT Ann Stephens FUCK5.7 .94 5 13
[root@node1 tmp]#

5)显示仅包含north的行    

[root@node1 tmp]#  sed -n '/north/p'  sedTest.txt
northwest NW Charles Main 3.0 .98 3 34
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
[root@node1 tmp]#

6)显示奇数行 

[root@node1 tmp]# sed -n '1~2p' sedTest.txt
northwest NW Charles Main 3.0 .98 3 34
southwest SW Lewis Dalsass 2.7 .8 2 18
southeast SE Patricia Hemenway 4.0 .7 4 17
northeast NE AM Main Jr. 5.1 .94 3 13
central CT Ann Stephens 5.7 .94 5 13
[root@node1 tmp]#

7)从第4行开始显示,并且把Hemenway改为Jones

[root@node1 tmp]#  sed  '1,3d;s/Hemenway/Jones/g' sedTest.txt
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Jones 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
[root@node1 tmp]#

本题实现的另一写法:sed -e '1,3d' -e 's/Hemenway/Jones/g' sed.txt

 

四、补充sed的高级用法:


 

 

    高级编辑命令:

        h:把模式空间中的内容覆盖至保持空间中;

        H:把模式空间中的内容追加至保持空间中;

        g:把保持空间中的内容覆盖至模式空间中;

        G:把保持空间中的内容追加至模式空间中;

        x:把模式空间中的内容与保持空间中的内容互换;

        n:覆盖读取匹配到的行的下一行至模式空间中;

        N:追加读取匹配到的行的下一行至模式空间中;

        d:删除模式空间中的行;

        D:删除多行模式空间中的所有行;

    

    示例:

        sed  -n  'n;p'  FILE:显示偶数行;

        sed  '1!G;h;$!d'  FILE:逆序显示文件的内容;

        sed  ’$!d'  FILE:取出最后一行;

        sed  '$!N;$!D' FILE:取出文件后两行;

        sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;

        sed  'n;d'  FILE:显示奇数行;

        sed 'G' FILE:在原有的每行后方添加一个空白行;

 

结 语    


        sed功能非常强大,熟练的使用会给我们在做文本编辑的时候带来想不到的方便。不过它在处理列的时候还是比不过awk,下一篇我们来说说awk。

 

附:如对上面描述有疑问,期待与朋友您共同探讨。