• sed命令详解


    sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

    然后读入下一行,执行下一个循环。这样不断重复,直到文件最后。文件内容并没有改变,除非使用重定向存储输出。

    sed语法:sed [option]……'script' inputfile……

    常用选项:

    -n  #不输出模式空间内容到屏幕,即不自动打印到屏幕

    -e  #多点编辑

    -f  /PATH/SCRIPT_FILE  #从指定文件中读取编辑脚本

    -r  #支持扩展的正则表达式

    -i.bak  #备份文件并原处编辑,.bak可以自定义

    一、script,地址命令

    地址定界:

    1、不给地址,则对全文进行处理

    2、单地址:n:指定的行,$:最后一行

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

    3、地址范围

      n1,n2  #意思为文本的n1行到n2行

      n,+m  #意思为显示n行,以及其后面的m行

      /pat1/,/part2/  #从匹配到pat1的行到part2的行

      n,/pat1/  #从n行开始,到pat1行结束

    4、~:步进

      1~2  #奇数行

      2~2  #偶数行

    举例:打印指定行的内容到屏幕

    执行命令:sed -n 'p' fstab #后面的p是指将匹配到前面的地址的内容打印到屏幕,这里前面的地址范围为空,则表示匹配文件所有的行

     执行命令:sed -n '2,3p' fstab  #只打印第2行到第3行的内容到屏幕

     执行命令: sed -n '6,$p' fstab  #只打印出第6行到文本最后一行得内容

     执行命令:sed -n '/^#/p' fstab    #匹配/ /中的模式,打印出以#开头的行

     

     执行命令:sed -n '2,//dev/disk/p' fstab  #打印第二行到包含/dev/disk的行的所有内容

    执行命令:sed -n '//etc/fstab/,/xfs/p' fstab  #打印出从包含/etc/fstab的行到包含xfs的行的内容

    执行命令:sed -n '1~2p' fstab  #打印出文档中的奇数行

    执行命令:sed -n '2~2p' fstab  #打印出文本的偶数行

    二、sed的编辑命令

    d  #删除模式空间匹配的行,并开启下一轮循环

    p  #打印出模式匹配的行,追加到默认输出的后面

    a []text  #在指定的行后面追加一行,支持使用 追加多行

    i []text  #在指定的行前面追加一行,支持使用 追加多行

    c []text  #替换行为单行或多行文本

    w /path/file  #保存模式匹配的行至指定文件

    r /path/file  #读取指定文件的文本至模式空间中匹配到的行的行后

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

    !  #模式空间中匹配行取反处理

    举例:打印出除/dev/mapper所在行的所有行

    执行命令:sed -n '//dev/mapper/d;p' fstab  #删除模式匹配到的行,然后打印出来,中间;表示执行完第一个命令后执行第二个命令

     执行命令:sed '3p' fstab  #没有加n意思为打印出所以的文本,将第三行的内容追加到第三行后面

    执行命令:sed  '/^UUID/a his is a test' fstab  #在UUID后面追加一行文本,this is a test

     执行命令:sed  '/^UUID/i his is a test' fstab  #在匹配的行的前面追加一行文本

    执行命令:sed  '/^UUID/c his is a test a test' fstab  #将匹配到的行替换为指定的文本内容, 意为换行

    执行命令:sed -n '/^UUID/w/root/fstab1' fstab

     执行命令:sed '/UUID/r/root/zhuijia' fstab  #将/root/zhuijia中的内容追加到匹配到的行的后面

    执行命令:sed -n '/UUID/=' fstab      #打印出含有该字符的行的行号

    执行命令:sed -n '/UUID/!p' fstab  #打印除匹配到的行以外的所有的行

    三、sed工具

    s///  #查找替换,支持使用s@@@或者s###

      g  #行内全局替换

      p  #显示替换成功的行

      w /path/file  #将替换成功的行保存至文件中

    举例:将fstab文件中的#全部去掉,然后打印出来

    执行命令:sed -nr 's/# *//g;p' fstab  #将所有的#且后面至少有一个空格的内容替换成无,然后选择所有行,并打印出来

    举例:取出UUID=后面的那一串数字,并打印出来

    执行命令:sed -nr 's/UUID=(*) /boot*/1/p' fstab  #利用正则的分组,将等号后面的内容取出并打印

    四、sed高级应用

    P  #打印模式空间开端至 内容(即模式空间第一行内容),并追加到默认输出之前

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

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

    g  #从保持空间取出数据覆盖至模式空间

    G  #从保持空间取出内容追加至模式空间

    x  #把模式空间中的内容与保持空间中的内容进行互换

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

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

    d  #删除模式空间中的行

    D  #如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使

       用合成的模式空间重新启动循环。如模式空间不包含换行符,则会像发出d命令那样启动正常的新的循环。

    保持空间:即在sed处理数据时,数据的一个暂存空间,sed默认是处理完一行的数据后,就清空模式空间的内容,继续进行下一一行的数据处理,保持空间则能暂时的存放数据。

    举例:打印文本的偶数行内容

    执行命令:sed -n 'n;p' num

     sed的处理过程:

    sed第一次取数据到模式空间时,因为有n参数,所以sed就把第二行的数据取出并覆盖到模式空间中,此时模式空间就只有第二行数据,然后执行p操作打印

    sed第二次取数据时,由于第二行数据已经取过了,所以从第三行开始取,取的时候,仍然受到n参数影响,所以sed把第四行的数据取出放到了模式空间中,并打印。

    sed的后续也是按照上面的那种方法取出数据,所以sed取出的数据应该依次为:第二行数据、第四行数据、第六行数据……即文本的所有偶数行,然后通过p选项打印到屏幕

    举例:倒序显示文本内容

    执行命令:sed '1!G;h;$!d' num

    sed工作过程:

    sed第一次取数据:运行1!G时,由于是第一行,所以不需要执行G操作,然后在执行h操作,即将第一行数据覆盖到保持空间中,然后删除模式空间中的行。

             此时模式空间中为空,保持空间中为第一行数据

    sed第二次取数据:由于是非首行,执行G操作,将保持空间中的第一行取出追加到模式空间的的第二行的后面,再执行h操作,将第一行第二行复制到保

              持空间中,并删除模式空间的内容,此时模式空间为空,保持数据为第二行和第一行

    如上执行过程,直到遇到了最后一行,将保持空间中的数据第9、8、、6、5、4、3、2、1行追加到模式空间中,由于是最后一行,不执行d动作,此时的

    模式空间中数据为:第10、9、8、7、6、5、4、3、2、1行,由于sed默认打印出所有处理过的行,而之前的操作模式空间都为空,所以不打印,到了最

    后一行,将模式空间中的数据打印出来。

    举例:打印出文本的最后一行

    执行命令:sed 'N;D' num

     sed工作过程:

    sed第一次取数据:读取第一行,然后执行N操作,将第二行的数据追加到模式空间,而后执行D操作,由于模式空间中有换行符,删除模式空间的第一行,即

              模式空间中的数据为第二行。

    sed第二次取数据:读取第由于第二行已经被取过了,这里取第三行,同上删除第一行,模式空间中的数据为第四行

    在此合成的模式空间启动循环,直至再也没有新的行读入,模式空间中就只有最后一行数据。然后打印到屏幕。

  • 相关阅读:
    mysql日期默认值格式('0000-00-00')错误解决
    休闲一下-精华-IMDB评分8分左右影片400多部!
    开机动画流程
    SystemServer启动服务
    理解Android进程创建流程
    android开机动画启动流程
    Android系统的启动优化
    Android 系统启动(init,zygote)
    Zygote
    init
  • 原文地址:https://www.cnblogs.com/awanderer/p/12196030.html
Copyright © 2020-2023  润新知