• 文本处理三剑客之 sed


    sed:文本流编辑器

      主要是对文件的快速增删改查,查询功能中最常用的是过滤,取行

      sed [选项] [sed内置命令字符] [输入文件]

      

      Options:

        -n:取消默认的sed输出,常与sed内置命令p连用

    sed -n '/要过滤的内容/或者行号p'

        -e:直接在命令行界面进行sed动作编辑,多点编辑
        -r:使用扩展的正则表达式
        -i:直接修改读取的文件内容,而不是由屏幕输出。若是不加此参数,就只是修改内存中的数据,不影响磁盘中的数据

      script:

        地址定界:
          1、不给地址,对全文进行处理
          2、单地址,
          #:指定的行
          /pattern/:被此处模式所能够匹配到的每一行

        地址范围:
          #,#:从#到#之间的行,包括##

          #,+#:从#行到#+#行

          /pat1/,/pat2/:匹配第一次被模式一和第一次被模式二匹配的行之间的行,贪婪模式!!!
          #,/par1/:第#行到第一次被part1匹配的行

        编辑命令:
          d:删除模式空间匹配的行

    sed '3d' file.txt # 数字表示行号
    sed '3,4d' file.txt # 3-4行删除

          p:显示模式空间中的内容

    sed -n '2p' file.txt  # 匹配第二行内容,如果不加-n,会将匹配的内容输出到屏幕两次
    sed -n '2p;4p' person.txt  2和4行
    sed -n '/xiaolizi1/p;/xiaolizi2/p' person.txt 

          a[]text:在指定行的后面追加文本,可使用 实现多行追加

    # 在第二行后追加内容
       sed '2a 要追加的内容' file.txt
    # 追加多行内容
      sed '2a 要追加的内容 要追加的内容' file.txt
    sed  '$a 106,xiaolizi1 107,xiaolizi2' person.txt  # 在最后一行追加两行内容 $表示结尾

          i[]text:在指定行的前面追加文本
          c[]text:替换行为单行或多行文本
          w /path/somefile:保存模式空间匹配的行到指定文件
          r /path/somefile:读取指定的文件的文本至模式空间匹配到的行的行后
          =:为模式空间中的行打印行号
          !: 对模式空间匹配的行取反处理

        查找替换:
          s///:支持使用其他分隔符:s@@@,s### ...

    sed 's#替换前的内容#替换后的内容#g' file.txt  # g表示整个文本内容,也就是全局替换,如果不添加,只会替换第一个匹配到的内容

    # 关于反向引用
      

    [root@oldgirl ~]# #echo 123456 ==》 <123456>  # 转换成此类格式的 1表示引用前面第一个括号内的内容
    [root@oldgirl ~]# echo 123456|sed -r 's#(.*)#<1>#g'
    <123456>
    [root@oldgirl ~]# #echo 123456 ==》<1><2><3><4><5><6>
    [root@oldgirl ~]# echo 123456|sed -r 's#([1-6])#<1>#g'
    <1><2><3><4><5><6>
    [root@oldgirl ~]# echo 123456|sed -r 's#(.)#<1>#g'
    <1><2><3><4><5><6>
    [root@oldgirl ~]# echo 123456|sed -r 's#.#<&>#g'
    <1><2><3><4><5><6>
    [root@oldgirl ~]# echo 123456|sed -r 's#.*#<&>#g'
    <123456>

    # 举个栗子

    # 需求将oldboy*.jpg图片变为avi扩展名文件
    # 第一个里程:找出要替换的文件信息
    [root@oldgirl ~]# ls oldboy*.jpg
    oldboy01.jpg oldboy03.jpg oldboy05.jpg oldboy07.jpg oldboy09.jpg
    oldboy02.jpg oldboy04.jpg oldboy06.jpg oldboy08.jpg oldboy10.jpg
    [root@oldgirl ~]# ls oldboy*.jpg|sed 's#.*#&#g'
    oldboy01.jpg
    oldboy02.jpg
    oldboy03.jpg
    oldboy04.jpg
    oldboy05.jpg
    oldboy06.jpg
    oldboy07.jpg
    oldboy08.jpg
    oldboy09.jpg
    oldboy10.jpg
    #  第二个里程:拼凑批量修改文件的命令
    [root@oldgirl ~]# ls oldboy*.jpg|sed 's#.*.jpg#&#g'
    oldboy01.jpg
    oldboy02.jpg
    oldboy03.jpg
    oldboy04.jpg
    oldboy05.jpg
    oldboy06.jpg
    oldboy07.jpg
    oldboy08.jpg
    oldboy09.jpg
    oldboy10.jpg

    [root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#1#g'
    oldboy01.
    oldboy02.
    oldboy03.
    oldboy04.
    oldboy05.
    oldboy06.
    oldboy07.
    oldboy08.
    oldboy09.
    oldboy10.
    [root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#mv 1jpg#g'
    mv oldboy01.jpg
    mv oldboy02.jpg
    mv oldboy03.jpg
    mv oldboy04.jpg
    mv oldboy05.jpg
    mv oldboy06.jpg
    mv oldboy07.jpg
    mv oldboy08.jpg
    mv oldboy09.jpg
    mv oldboy10.jpg
    [root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#mv 1jpg 1avi#g'
    mv oldboy01.jpg oldboy01.avi
    mv oldboy02.jpg oldboy02.avi
    mv oldboy03.jpg oldboy03.avi
    mv oldboy04.jpg oldboy04.avi
    mv oldboy05.jpg oldboy05.avi
    mv oldboy06.jpg oldboy06.avi
    mv oldboy07.jpg oldboy07.avi
    mv oldboy08.jpg oldboy08.avi
    mv oldboy09.jpg oldboy09.avi
    mv oldboy10.jpg oldboy10.avi

    # 第三里程碑:将命令输出的信息,进行执行
    [root@oldgirl ~]# ls oldboy*.jpg|sed -r 's#(.*)jpg#mv 1jpg 1avi#g'|bash
    [root@oldgirl ~]# ls oldboy*.avi
    oldboy01.avi oldboy03.avi oldboy05.avi oldboy07.avi oldboy09.avi
    oldboy02.avi oldboy04.avi oldboy06.avi oldboy08.avi oldboy10.avi

      

    # 以上只是一个需求,为了演示反向引用,如果批量重命名的话,使用rename即可

        替换标记:

          g:行内全局替换
          p:显示替换成功的行
          w file:将替换成功的行保存至文件中

    + g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除

    + G:[address[,address]]G 将hold space中的内容append到pattern space 后

    + h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除

    + H:[address[,address]]H 将pattern space中的内容append到hold space 后

    + d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中

    + D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行

    PS:不论是使用G、g还是H、h,它们都是将hold space里面的内容“copy”到patt

    h: 把模式空间中的内容覆盖至保持空间中
    H:把模式空间中的内容追加至保持空间中
    g: 从保持空间取出数据覆盖至模式空间
    G:从保持空间取出内容追加至模式空间
    x: 把模式空间中的内容与保持空间中的内容进行互换
    n: 读取匹配到的行的下一行覆盖至模式空间
    N:读取匹配到的行的下一行追加至模式空间
    d: 删除模式空间中的行
    D:删除当前模式空间开端至 的内容(不再传至标准输 出),放弃之后的命令,但是对剩余模式空间重新执行sed

  • 相关阅读:
    《血战钢锯岭》影评
    座椅
    指示灯点亮/闪烁
    存钱大法
    加注燃油
    处理过热
    收入“三分法”
    请求文件
    规格
    处理瘪胎
  • 原文地址:https://www.cnblogs.com/flashfish/p/10722583.html
Copyright © 2020-2023  润新知