• sed 命令多行到多行的定位方式


    本文提要:

    • sed 命令定位方式的分类
    • 着重对 /pattern/,/pattern/ 的定位方式进行阐述

    定位方式分类

    总体上,只需要分为两类,即:x 和 x,y 。如果在范围后加 ! 则表示取补集,即指定范围之外的所有行。

    其中,x 和 y 均有两种形式,即:数字和正则表达式,数字直接指定即可,正则表达式则用 /pattern/ 格式给出。举两个栗子:2,4 表示第 2 行到 第 4 行;/stdio.h/,5 简单说可以阐述为匹配 stdio.h 的行到第 5 行的范围,但是不准确,因为正则表达式匹配的行可能不止一行,更可能比后者行号大,这种情况下要分析其范围,则需要按照一定的规则分析,请看下一节。

    另外一些资料说 /pattern/pattern/ 表示查询两个表达式,笔者在自己的平台上测试了发现不行,不知是否打开方式不正确(GNU sed 4.4),但是其支持扩展正则表达式(-E 选项),所以可以用扩展正则实现。

    定位方式分析

    这里直接给出结论,然后再给出一个简单的极端的栗子用以验证。针对 x,y (x,y均可能是由 /pattern/ 匹配的多行)的匹配方式结论为:

    首先假定一个控制输出的开关,然后从首行依次匹配,到 x 集合中的行时,就打开输出开关,允许输出,到 y 集合中的行时,先输出该行,然后关闭输出开关,禁用输出。

    这样所有输出的行就是 x,y 的范围,它可能是一个不连续集合。

    下面给出一个栗子结束本文:

    input.txt

    grweag open
    hgfds open
    gfdsg
    geahg close
    feaws
    grsa close
    gfdsg
    fdsa open
    fdsa
    gadfa close
    fdsag close
    fewag
    gerwaef open
    gewsa
    gewag
    gdfsa
    

    执行

    $ cat -n input.txt | sed -n '/open/,/close/p'
         1   grweag open
         2   hgfds open
         3   gfdsg
         4   geahg close
         8   fdsa open
         9   fdsa
        10  gadfa close
        13  gerwaef open
        14  gewsa
        15  gewag
        16  gdfsa
    

    显示的都是自 open 后 到 close 的行,close 后则不显示,直到重新 open;open 后如果没有 close 则其后所有行都在范围内。如此我们可以推测如果 y 如果没有匹配任何一行,则最终的范围应该是 x 中最前面一行到文本的最后一行。

  • 相关阅读:
    全局比对与动态规划
    汉诺塔游戏的递归解析
    scikit-learn 多分类混淆矩阵
    Python argparse 子命令
    优雅的查看json文件
    Python数据结构和算法学习笔记4
    Python学习笔记29
    Python学习笔记28
    Python数据结构和算法学习笔记3
    Python数据结构和算法学习笔记2
  • 原文地址:https://www.cnblogs.com/dawn-l/p/8506209.html
Copyright © 2020-2023  润新知