Linux文本处理之sed

Linux文本处理之sed

      上一篇我介绍了文本处理grep,现在我来介绍一下文本处理三剑客的第二剑客——sed。

      sed 是一个比较古老的,功能十分强大的用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作。sed 本身是一个非常复杂的工具,有专门的书籍讲解 sed 的具体用法,但是个人觉得没有必要去学习它的每个细节,那样没有特别大的实际意义。sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

    1.sed用法

        sed [-hnV][-e<script>][-f<script文件>][文本文件]

       2.参数说明(选项命令)

            -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。

  •       -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。

  •       -h或--help 显示帮助。

  •       -n或--quiet或--silent 仅显示script处理后的结果。

  •       -V或--version 显示版本信息。

  •       -i.bak 备份文件并原处编辑

  •       -r 可以使用扩展正则

        3.动作说明(编辑命令)   

  •       a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)

  •       c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

  •       d :删除,因为是删除,所以 d 后面通常不接任何东西;

  •        i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

  •       p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

  •       s :取代,可以直接进行取代的工作,通常这个 s 的动作可以搭配正规表示法

  •       =:为模式空间中的行打印行号

  •       !:模式空间匹配行取反处理

        4.地址定界

               a.关于定址:

                      默认情况下sed会对每一行内容进行匹配、处理、输出,某些情况不需要对处理的文本全部编辑,只需要其中的一部分,比如1-10行,偶数                   行,或者是包含"hello"字符串的行,这种情况下就需要我们去定位特定的行来处理,而不是全部内容,这里把这个定位指定的行叫做"定址"

               b. 数字定址:数字定址其实就是通过数字去指定具体要操作编辑的行,如下:

[root@localhost(yuaning) ~]# cat abc.txt 
a
b
c
d
e
[root@localhost(yuaning) ~]# sed -nr '4s/d/4/p' abc.txt (指定第4行的d替换成4,-n默认不输出,记得在正则表达式最后加上p)
4
[root@localhost(yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux
[root@localhost(yuaning) ~]# sed -n '2,4s/linux/hello/p' abc.txt 
2hello
3hello
4hello   (指定第2行到第4行的字符Linux替换为hello)
[root@localhost(yuaning) ~]# sed -n '1,+2s/linux/hello/p' abc.txt 
1hello
2hello
3hello   (指定第1到1+2行的字符Linux替换为hello)
[root@localhost(yuaning) ~]# sed -n '$s/linux/hello/p' abc.txt 
5hello   ($表示最后一行)
[root@localhost(yuaning) ~]# sed -n '2!s/linux/hello/p' abc.txt 
1hello
3hello
4hello
5hello    (!表示除了指定行以外的行,记得不要写反了)

               c.正则表达式定址:正则定址使用目的和数字定址完全一样,使用方式上有所不同,是通过正则表达式的匹配来确定需要处理编辑哪些行,其它      行就不需要额外处理,如下:

[root@localhost(yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux
[root@localhost(yuaning) ~]# sed '/3linux/d' abc.txt 
1linux
2linux
4linux
5linux     (表示只把指定行删除,其他行不变)
[root@localhost(yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux

666
[root@localhost(yuaning) ~]# sed '/^[[:digit:]].*/d' abc.txt 

[root@localhost(yuaning) ~]# sed '/^[[:digit:]][[:lower:]]\+/d' abc.txt 

666   (用正则表达式选择匹配的行删除)

               d.数字和正则混合使用:正则表达式和数字组合更为灵活

[root@localhost(yuaning) ~]# cat abc.txt 
1linux
2linux
3linux
4linux
5linux

666
[root@localhost(yuaning) ~]# sed '4,/^$/d' abc.txt 
1linux
2linux
3linux
666       (表示删除从第4行到空白行)

              e.高级使用:读取一个数据指令从第一个挨个执行到最后一个指令,指令用;隔开,然后进行下一个数据的循环,直到数据全部执行一次

                     模式空间和保持空间:模式空间初始化为空,处理完一行后会自动输出到屏幕并清除模式空间;保持空间初始化为一个空行,也就是默

       认带一个\n,处理完后不会自动清除。模式空间和保持空间,从程序的角度去看,其实就是sed在工作的时候占用了一些内存空间和地址,

       sed工作完毕就会把内存释放并归还给操作系统。

     g:将保持空间的内容拷贝到模式空间中,原模式空间将被清零。

     G:将保持空间的内容追加到模式空间\n之后。

     h:将模式空间的内容拷贝到保持空间中,原保持空间将被清零。

    H:将模式空间的内容追加到保持空间\n之后。

    d:删除模式空间中的所有行,并读入下一行。

    D:删除模式空间的第一行,不读入下一行。

    x:交换内容

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

    N:读取匹配到下一行追加到模式空间后。

[root@localhost(yuaning) ~]# seq 1 10 |sed -n 'n;p'   (打印偶数行)
2
4
6
8
10   (把读取到1放到模式空间,然后n指令紧接着把下一行的2覆盖1,然后p指令打印)
[root@localhost(yuaning) ~]# seq 1 5 |sed '1!G;h;$!d'    (倒序输出)
5
4
3
2
1
[root@localhost(yuaning) ~]# seq 1 5 |sed -n '1!G;h;$p'
5
4
3
2
1
[root@localhost(yuaning) ~]# seq 1 5 |sed 'N;D'   (输出最后一行)
5
[root@localhost(yuaning) ~]# seq 1 5 |sed '$!d'
5
[root@localhost(yuaning) ~]# seq 1 5 |sed '$!N;$!D'  (输出最后两行)
4
5
[root@localhost(yuaning) ~]# seq 1 3 |sed 'G'   (每行后面加一个空行)
1

2

3
[root@localhost(yuaning) ~]# seq 1 10 |sed 'n;d'   (输出奇数行)
1
3
5
7
9

            sed的用法很多,更多的需要在以后的工作中慢慢摸索,这里只是一个简单的记录。

猜你喜欢

转载自blog.51cto.com/13805636/2151558