• sed的N;P用法


    sed的N;P用法

    原文地址
    这里介绍的是sed的一个多行模式的使用,一开始对sed中命令N的用法不是很理解,经过多次尝试,通过几个例子对N的用法进行总结:

    N即Next,它同n(next)的区别是:N命令将下一行追加到模式空间中,不打印模式空间的值,而使用n是打印当前模式空间的内容,并且读取下一行

    蒙受启发
    > cat num
    1
    2
    3
    4
    5
    6
    7
    8
    9
    > sed ’N;$!D’ num
    8
    9
    >
    
    执行过程详解:
    
    首先解释重要的几个命令的用途:
    
    D删除模板块的第一行 并返回脚本头部执行
    
    $ 锚定行的结束 如:/sed$/匹配所有以sed结尾的行 ,继续执行
    
    ! 表示后面的命令对所有没有被选定的行发生作用。
    大概说一下:
    N;$!D
    首先读入第一行: 1 (注:这不是N命令读入的)
    执行N,读入第2行,追加到1后面,成了1
    2;
    $!D,不是最后一行,所以执行D,模式空间由1
    2成了2, 控制流返回脚本第一条命令,即N。这样一直执行
    ….
    直到执行N读入第9行:9,这里模式空间为:8
    9
    $!D,因为是最后一行,所以不执行D,控制流到达脚本底部,输出模式空间的内容:
    8
    9
    
    上面这段例子摘自网络,给了我很大启发,另外测试如下:
    
    关于N:
    
    append the next line of input into the pattern space. 这是sed用户手册当中说的,很明显,意思是将当前读入行的下一行读取到当前的模式空间。
    
    关于P:
    
    Print up to the first embedded newline of the current pattern space.打印当前模式空间中的第一块。
    
    关于D:
    
    Delete up to the first embedded newline in the pattern space.  Start next cycle, but skip reading from  the  input if there is still data in the pattern space.
    
    删除当前模式空间的第一块,重新开始下一次循环,这个在后面例子中给予验证:
    
    各种验证
    验证一:NP结合
    
    > cat num
    1
    2
    3
    4
    > sed ’N;P’ num
    1
    1
    2
    3
    3
    4
    
    > sed ’N;p’ num
    1
    2
    1
    2
    3
    4
    3
    4
    
    对于上面的结果给予解释:P用于打印当前模式空间的第一块,而p打印整个当前模式空间。所以当使用P的时候,步骤如下:首先sed默认的读取1,模式空间为1,让你后执行N,模式空间变成1
    2
    ,然后执行P,也就是打印1
    ;当前行的处理,打印模式空间也就是1
    2
    ;这时sed再从文件中读取下一行,也就到了3
    ,执行N;模式空间变成了3
    4
    ;
    
    执行P;打印3
    ;继续执行当前行的处理,打印模式空间3
    4
    ;sed再从文件中读取下一行,发现没有了,结束处理流程。对于小p,和d大P的区别了解的话也就不难理解了。
    
    验证二:ND结合
    
    > cat num
    1
    2
    3
    4
    > sed ’N;D’ num
    4
    > sed ’N;d’ num
    >
    
    对于D;删除当前模式空间第一块,并且返回命令开始继续执行。上述结果解释如下:
    
    首先sed读取一行1
    ;执行到N;模式空间为1
    2
    ;执行D;模式空间变为:2
    ;跳到前面继续执行N;模式空间变为2
    3
    ;执行D;模式空间变为:3
    ;跳回继续执行N;模式空间变为:3
    4
    ;接着执行D;模式空间变为:4
    ;跳回执行N的时候发现没有了下一行,所以跳出循环,接着sed继续处理,打印4
    ;sed继续再读取文件的时候没有数据,所以结束处理。
    
    验证3:NpD,再验证
    
    > cat num
    1
    2
    3
    4
    > sed ’N;p;D’ num
    1
    2
    2
    3
    3
    4
    4
    
    首先,sed读取一行,执行到N;模式空间为:1
    2
    ;执行p;打印1
    2
    ;执行D;模式空间变为:2
    ;跳回执行N;模式空间变为:2
    3
    ;执行p;打印2
    3
    ;执行D;模式空间变为:3
    ;跳回执行N;模式空间变为:3
    4
    ;执行p;打印3
    4
    ;执行D;模式空间变为:4
    ;跳回执行N;没有数据。跳出循环,sed继续处理,默认打印模式空间所有数据4
    ; 因此只有1打印一遍,其余行都打印2遍。
    
    另外d和大D的区别了解以后也就明白了。
    
    总结体会:sed处理始终在一个模式空间中进行,而且对于待处理文件,N读取了文件中的一行后,sed继续处理的时候应该是接着去读取,这里我理解是sed读取文件和N读取文件这些的共用一个指针。
    
    在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。
    
    常用命令:
    
    利用sed给每行添加行号。
    
    > cat passwd
    
    uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
    mqq:x:1000:100::/usr/local/app:/bin/bash
    mysql:x:1001:1001::/home/mysql:/bin/bash
    natpan:x:1002:100::/data/natpan:/bin/bash
    nagios:x:1003:100::/home/nagios:/bin/bash
    nagios:x:1003:100::/home/nagios:/bin/bash
    nagios:x:1003:100::/home/nagios:/bin/bash
    给每行加上行号,命令如下:
    > sed = passwd | sed ’N;s/
    /:   /g’
    1:   uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
    2:
    3:   mqq:x:1000:100::/usr/local/app:/bin/bash
    4:   mysql:x:1001:1001::/home/mysql:/bin/bash
    5:   natpan:x:1002:100::/data/natpan:/bin/bash
    6:   nagios:x:1003:100::/home/nagios:/bin/bash
    7:   nagios:x:1003:100::/home/nagios:/bin/bash
    8:   nagios:x:1003:100::/home/nagios:/bin/bash
    mqq@wsd_207_62_sles10sp1:~/alenzhou/shell_test/sed>
    空行不打印行号,做一下匹配就行
    > sed ’/./=’ passwd | sed ’/./N;s/
    /:   /g’
    1:   uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
    3:   mqq:x:1000:100::/usr/local/app:/bin/bash
    4:   mysql:x:1001:1001::/home/mysql:/bin/bash
    5:   natpan:x:1002:100::/data/natpan:/bin/bash
    6:   nagios:x:1003:100::/home/nagios:/bin/bash
    7:   nagios:x:1003:100::/home/nagios:/bin/bash
    8:   nagios:x:1003:100::/home/nagios:/bin/bash
    
    
  • 相关阅读:
    [loj2706]文本编辑器
    [atAGC053C]Random Card Game
    [atAGC056E]Cheese
    [cf1615G]Maximum Adjacent Pairs
    [cf739D]Recover a functional graph
    [uoj693]地铁规划
    [atAGC053E]More Peaks More Fun
    [atAGC056B]Range Argmax
    [atAGC056F]Degree Sequence in DFS Order
    SceneGrabber NET 视频批量自动截图软件使用技巧
  • 原文地址:https://www.cnblogs.com/irockcode/p/8018663.html
Copyright © 2020-2023  润新知