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

    原文地址

    这篇文章主要是我参考命令的,直接复制粘贴,有问题请拍砖

    A. sed执行模板=sed ‘模式{命令1;命令2}’ 即逐行读入模式空间,执行命令,最后输出打印出来
    B. p打印当前模式空间所有内容,追加到默认输出之后;P打印当前模式空间开端至 的内容,并追加到默认输出之前。
    Sed并不对每行末尾 进行处理,但是对N命令追加的行间 进行处理,因为此时sed将两行看做一行。
    C. 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   
    [root@localhost ~]#
    
    注释:
    	读取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代表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,执行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,执行N,得出1
    2,执行D,得出2,执行N,得出2
    3,执行D,得出3,
    	依此类推,得出5,执行N,条件失败退出,因无-n参数,故输出5
    

    E. 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	 
    

    F. 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 ~]#
    在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,
    	除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。
    	接着模式空间被清空,并存入新的一行等待处理。
    	在上面的例子里,匹配test的行被找到后,将存入模式空间,
    	h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。
    第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,
    	然后把它放回模式空间中,然后被打印(也就末尾)。
    [root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/G’ cs1.txt   #追加到包含102的行的下一行
    PBCSPOFT0101    6
    PBCSPOFT0102    0
    PBCSPOFT0101    6
    PBCSPOFT0103    8
    PBCSPOFT0104    0
    
    
    将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,执行h,复制到缓存区,执行s,模式空间得到匹配到的字母a,
    	然后执行y,将a转成A,执行G,追加缓存区内容到模式空间,得A
    This is a and a is 1;
    	执行s,重新排列,得出This is 1 and 1 is A;以此类推,得出结果。
    	这里需要注意的是匹配的内容中,空格一定要处理好,
    	空格处理不对,会造成第二次s匹配错误,无法执行重新排列或排列错误
    

    G. x命令

    x命令是将当前缓存区和模式空间内容互换
    [root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/x’ cs1.txt   #互换模式空间和保持缓冲区的内容。也就是把包含101与102的行互换。应该是替换,待百度
    PBCSPOFT0101    6
    PBCSPOFT0101    6
    PBCSPOFT0103    8
    PBCSPOFT0104    0
    
    
    [root@wmsvmpc ~]#  echo –e “a
    b
    c
    d
    ”|sed –nr ‘H;${x;s/
    //g;p}’
    abcd
    r:use extended regular expressions in the script,使用功能更强大的正则表达式。
    ${} 表示处理到文件最后一行时执行{}中的命令,x把之前存入缓存区的数据按先入先出的顺序放入模式空间,然后做替换,最后打印
    
  • 相关阅读:
    tyvj 1031 热浪 最短路
    【bzoj2005】 [Noi2010]能量采集 数学结论(gcd)
    hdu 1394 Minimum Inversion Number 逆序数/树状数组
    HDU 1698 just a hook 线段树,区间定值,求和
    ZeptoLab Code Rush 2015 C. Om Nom and Candies 暴力
    ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS
    ZeptoLab Code Rush 2015 A. King of Thieves 暴力
    hdoj 5199 Gunner map
    hdoj 5198 Strange Class 水题
    vijos 1659 河蟹王国 线段树区间加、区间查询最大值
  • 原文地址:https://www.cnblogs.com/irockcode/p/8018575.html
Copyright © 2011-2022 走看看