【问题标题】:Print consecutive lines with a pattern打印带有图案的连续行
【发布时间】:2018-09-06 14:33:12
【问题描述】:

我正在尝试提取以# 开头的第一组行。 我只是想动态获取第一个模式

示例: 输入

# script:

something 

## Select the operation **  -
# mkfolders)    create      -
# copy)     copy Overlay  -
# bkp)      BKP of overlay  -

something

# commentary
# commentary
something

输出

## Select the operation **
# mkfolders)    create          -
# copy)         copy Overlay    -
# bkp)          BKP of overlay  -

我为此使用了以下 sed 命令

sed -n 5,8p 文件

它的问题是,如果文件中有任何更改,则必须更改命令。欢迎仅针对第一组连续行的动态解决方案:

有什么办法吗?

提前致谢。

【问题讨论】:

    标签: text awk sed printing


    【解决方案1】:

    使用awk的段落模式

    $ awk -v RS= '/^#/{print; exit}' ip.txt
    # script:
    
    $ awk -v RS= '/^##/{print; exit}' ip.txt
    ## Select the operation **  -
    # mkfolders)    create      -
    # copy)     copy Overlay  -
    # bkp)      BKP of overlay  -
    
    • -v RS=当RS设置为空字符串时,一个或多个连续的空行作为输入记录分隔符
    • /^##/ 输入以## 开头的记录
      • print; exit 打印输入记录,然后退出,因为只需要第一个这样的记录


    问题有点不清楚,下面的代码将打印第一条连续两行有#字符的记录

    $ awk -v RS= '/#[^\n]+\n#/{print; exit}' ip.txt
    ## Select the operation **  -
    # mkfolders)    create      -
    # copy)     copy Overlay  -
    # bkp)      BKP of overlay  -
    

    【讨论】:

      【解决方案2】:

      这可能对你有用(GNU sed):

      sed -rn '/^\s*#/!b;:a;N;/^\s[^#]/M!ba;/^(\s*#.*\n#[^\n]*).*/!b;s//\1/p;q' file
      

      忘记不以# 开头的行。收集模式空间中的后续行,直到不以# 或文件结束条件开头的行。如果集合少于两行,请忘记它们并重复。否则,如果最后一行不是以# 开头,则删除它,打印集合并退出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多