zoukankan      html  css  js  c++  java
  • Sed命令n,N,d,D,p,P,h,H,g,G,x解析


     摘自:https://blog.csdn.net/WMSOK/article/details/78463199

    Sed命令n,N,d,D,p,P,h,H,g,G,x解析

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WMSOK/article/details/78463199

    前言

    • sed执行模板=sed ‘模式{命令1;命令2}’ 即逐行读入模式空间,执行命令,最后输出打印出来.

    • p打印当前模式空间所有内容,追加到默认输出之后;P打印当前模式空间开端至 的内容,并追加到默认输出之前。 
      Sed并不对每行末尾 进行处理,但是对N命令追加的行间 进行处理,因为此时sed将两行看做一行。

    n和N命令

    • n命令简单来说就是提前读取下一行,覆盖模型空间前一行,然后执行后续命令。然后再读取新行,对新读取的内容重头执行sed。 
      例子:从aaa文件中取出偶数行
    [root@localhost ~]# cat a.txt This is 1    This is 2    This is 3    This is 4    This is 5 [root@localhost ~]# sed –n ‘n;p’ a.txt This is 2    This is 4   
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    读取This is 1,执行n命令,此时模式空间为This is 2,执行p,打印模式空间内容This is 2,之后读取This is 3,执行n命令,此时模式空间为This is 4,执行p,打印模式空间内容This is 4,之后读取This is 5,执行n命令,因为没有了,所以退出,并放弃p命令。因此,最终打印出来的就是偶数行。

    • N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有 换行符,然后执行后续命令。然后再读取新行,对新读取的内容重头执行sed。此时,新读取的行会覆盖之前的行(之前的两行已经合并为一行)。
    #例子:从aaa文件中读取奇数行 [root@localhost ~]# sed –n ‘N;P’ a.txt   -----因为读取第5行时,执行N,发现没有第6行,不满足,就退出,放弃P命令 This is 1    This is 3    [root@localhost ~]# sed –n ‘$!N;P’ a.txt    This is 1    This is 3    This is 5 [root@localhost ~]#
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注释中1代表This is 1 2代表This is 2 以此类推 
    注释:读取1,$!条件满足(不是尾行),执行N命令,得出1 2,执>行P,打印得1,读取3,$!条件满足(不是尾行),执行N命令,得出>3 4,执行P,打印得3,读取5,$!条件不满足,跳过N,执行P,打印得5

    d和D命令

    • d命令是删除当前模式空间内容(不再传至标准输出),并放弃之后的命令,并对新读取的内容,重头执行sed。
    [root@localhost ~]# sed ‘n;d’ a.txt  This is 1    This is 3    This is 5 [root@localhost ~]#
    • 1
    • 2
    • 3
    • 4
    • 5

    注释:读取1,执行n,得出2,执行d,删除2,得空,以此类推,读取3,执行n,得出4,执行d,删除4,得空,但是读取5时,因为n无法执行,所以d不执行。因无-n参数,故输出1 3 5

    • D命令是删除当前模式空间开端至 的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed。
    Sed 'N;D' aaa            This is 5   
    • 1
    • 2

    注释:读取1,执行N,得出1 2,执行D,得出2,执行N,得出2 3,执行D,得出3,依此类推,得出5,执行N,条件失败退出,因无-n参数,故输出5

    y命令:对之前匹配的字符逐个替换

    [root@localhost ~]# awk '{print $0"h"}' a.txt | sed ‘y/his/HIS/’ THIS IS 1H THIS IS 2H THIS IS 3H THIS IS 4H THIS IS 5H [root@localhost ~]#sed 's/[a-z]/u&/g' ddd    This is A and A is 1    This is B and B is 2    This is C and C is 3    This is D and D is 4    This is E and E is 5     #此外,如果需要对某个字符串进行大小写转换,则可使用如下方法     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    h命令,H命令,g命令,G命令

    • h命令是将当前模式空间中内容覆盖至缓存区,H命令是将当前模式空间中的内容追加至缓存区
    • g命令是将当前缓存区中内容覆盖至模式空间,G命令是将当前缓存区中的内容追加至模式空间
    [root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘$G’ cs1.txt  PBCSPOFT0101    6 PBCSPOFT0102    0 PBCSPOFT0103    8 PBCSPOFT0104   0 PBCSPOFT0101    6 [root@wmsvmpc ~]#
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。 
    在上面的例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,然后被打印(也就末尾)。

    [root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/G’ cs1.txt    PBCSPOFT0101    6 PBCSPOFT0102    0 PBCSPOFT0101    6 PBCSPOFT0103    8 PBCSPOFT0104    0 #追加到包含102的行的下一行
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    将ddd文件中数字和字母互换,并将字母大写

    cat ddd.sed h   {   s/.*is (.*) and .*/1/   y/abcde/ABCDE/ G   s/(.*)
    (.*is ).*(and ).*(is )(.*)/25 35 41/   }    sed –f ddd.sed ddd   This is 1 and 1 is A   This is 2 and 2 is B   This is 3 and 3 is C   This is 4 and 4 is D   This is 5 and 5 is E    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注释:读取1,执行h,复制到缓存区,执行s,模式空间得到匹配到的字母a,然后执行y,将a转成A,执行G,追加缓存区内容到模式空间,得 
    A This is a and a is 1;执行s,重新排列,得出This is 1 and 1 is A;以此类推,得出结果。 
    这里需要注意的是匹配的内容中,空格一定要处理好,空格处理不对,会造成第二次s匹配错误,无法执行重新排列或排列错误

    这里写图片描述

    x命令

    x命令是将当前缓存区和模式空间内容互换

    [root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/x’ cs1.txt    PBCSPOFT0101    6 PBCSPOFT0101    6 PBCSPOFT0103    8 PBCSPOFT0104   0 #互换模式空间和保持缓冲区的内容。也就是把包含101与102的行互换。应该是替换.  [root@wmsvmpc ~]#  echo –e "a
    b
    c
    d
    "|sed –nr 'H;${x;s/
    //g;p}' abcd
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    r:use extended regular expressions in the script,使用功能更强大的正则表达式。 
    ${} 表示处理到文件最后一行时执行{}中的命令,x把之前存入缓存区的数据按先入先出的顺序放入模式空间,然后做替换,最后打印

  • 相关阅读:
    阿里--面经 搜集
    阿里一面经验总结
    System对象
    JDBC-oracle(登陆)
    博客静态页面
    设计模式(1)---Factory Pattern
    软件设计师备考经验(含新旧版本对比)
    第九课,ROS仿真1
    参数服务器相关的问题
    3.空域图像处理的洪荒之力
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/9710412.html
Copyright © 2011-2022 走看看