• 文本处理三剑客之sed命令详解


    sed是流编辑器,可以对文本进行逐行判断并编辑的一种非常强大的文本处理工具

    工作原理:

    1.读取一行到模式空间(pattern space)

    2.从指定的操作指令集中取出第一个指令,判断是否匹配所要的模式

    3.不匹配就忽略后续的编辑指令,直接回到第2步读取下一条指令,以此类推,直到所有指令执行完毕

    4.输出缓存在模式空间的内容,有-n选项则抑制这项输出,回到第一步继续读取下一行的内容,重复上述操作

    5.直到所有行都处理完毕,结束

    注:所有的处理都是对模式空间里的内容进行处理

    使用格式:sed [option]... {Script} [FILE]...(其中Script包括地址跟编辑命令)

    常用选项:

    -n  抑制模式空间的行输出

    -e  多项编辑命令一次性执行

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

    -f  file 将操作命令集写在文件中,使用-f调用该文件

    -i  直接修改源文件

    -i.bak 直接修改源文件的同时生成备份文件

    地址:

      空地址:对全文进行处理

      单地址

        n 行号,对第n行进行处理

        /pattern/ 被正则表达式匹配到的行

      地址对:

        n,m  第n行到第m行

        n,+m   从第n行到向下m行

        n,/pattern/  从第n行到正则表达式匹配到的行

        /pattern1/,/pattern2/  从pattern1匹配到的行到pattern2匹配到的行

        $  最后一行

      步进地址表示法:

        n~m 从第n行开始,每隔m行处理一行,例,处理所有奇数行:1~2;所有偶数行:2~2

    编辑命令:

    模式空间命令:

      d:delete,删除模式空间的内容

      p:print,将模式空间里的内容打印至屏幕

      =:输出行号

      n:next,读取下一行

      l:list,输出行控制符,类似$, 等

      [line-address]cstring:change,改变指定行的内容为string,只支持单行处理

      [line-address]aSTRING:append,在指定行下一行追加内容,只支持单行处理

      [line-address]iSTRING:insert,在指定行上一行追加内容,只支持单行处理

      s/RegExp/REPLACE/g:search,搜索与替换,"/"可以换成其他符号:#@%…支持多行处理

      在s///中使用分组及后向引用   eg: sed -r 's/i love (S+) and (S+)/1 love 2/' /tmp/test

      y/abc/xyz/:转换字符,a转成x,b转成y,c转成y,逐一对应转换   

      [line-address]r file:read,将文件 file 的内容读取到指定行中

      w file:write,保存内容至文件 file 中

      [line-address]q : quit,读取到匹配行之后退出

      N:将下一行读至模式空间,用 连接上一行,若其后再无操作,则等价于跳过下一行

      P:输出上一行的内容

      D:删除上一行的内容

    保持空间命令:

      H/h:hold,将模式空间内容复制(h),通过 追加(H)到保持空间

      G/g: get,将保持空间内容复制(g),通过 追加(G)到模式空间

      x:exchange,将保持空间内容和模式空间内容交换

    例子:

    1.使用n或p打印奇数行或偶数行(列出4种方法)

    1 sed -n 'p;n' test.txt #奇数行
    2 sed -n 'n;p' test.txt #偶数行
    3 sed -n '1~2p' test.txt #奇数行
    4 sed -n '2~2p' test.txt #偶数行

    2.对于包含test到west之间的行,每行加上字符串'aaa bbb'

      sed '/test/,/west/s/$/aaa bbb/' file 

    3. 查找包含line1的行到包含line2的行之间的所有aa bbb替换成AA BBB

      sed '/line1/,/line2/s/aa bbb/AA BBB/' test.sh 

    4.显示第一次匹配到的3到最后一行输出

      sed -n '/3/,$p' test.sh 

    5.逆序显示文本内容

    1 sed '1!G;h;$!d' test
    2 sed -n  '1!G;h;$p' test

    6.删除原有的所有空白行,而后为所有的非空白行后添加一个空白行

      sed '/^$/d;G' /etc/passwd 

    7.将'yes'替换成'no',并且只在行中未出现字串'hello'的情况下替换

      sed '/hello/ !s/yes/no/g' file 

    8.将每行的字符逆序显示

     sed '/ /!G;s/(.)(.* )/&21/;//D;s/.//' file 

    这题较难,给一个流程:

    PATT:abc$
    HOLD:$
    COMM:/ / !G
    PATT:abc $
    HOLD:$
    COMM:s/(.)(.* )/&21/
    PATT:abc bc a$
    HOLD:$
    COMM:// D
    PATT:bc a$
    HOLD:$
    COMM:/ / !G
    PATT:bc a$
    HOLD:$
    COMM:s/(.)(.* )/&21/
    PATT:bc c ba$
    HOLD:$
    COMM:// D
    PATT:c ba$
    HOLD:$
    COMM:/ / !G
    PATT:c ba$
    HOLD:$
    COMM:s/(.)(.* )/&21/
    PATT:c cba$
    HOLD:$
    COMM:// D
    PATT: cba$
    HOLD:$
    COMM:/ / !G
    PATT: cba$
    HOLD:$
    COMM:s/(.)(.* )/&21/
    PATT: cba$
    HOLD:$
    COMM:// D
    PATT: cba$
    HOLD:$
    COMM:s/.//
    PATT:cba$
    HOLD:$
    cba

    9.将数字'1234567'显示为1,234,567

     echo "1234567" | sed ':a;s/B[0-9]{3}>/,&/;ta' 

  • 相关阅读:
    STM32—LAN8720学习
    STM32F4以太网MAC接口
    分治思想应用题
    网易笔试编程题
    python正则表达式
    【论文笔记】CenterNet: Keypoint Triplets for Object Detection
    【论文笔记】Guided Anchor:Region Proposal by Guided Anchoring
    【论文笔记】SNIP:An Analysis of Scale Invariance in Object Detection
    【论文笔记】FCOS:Fully Convolutional One-Stage Object Detection
    【论文笔记】CenterNet:Objects as Points
  • 原文地址:https://www.cnblogs.com/fllf/p/10023301.html
Copyright © 2020-2023  润新知