【问题标题】:Get lines between two patterns获取两个模式之间的线条
【发布时间】:2018-06-08 18:56:31
【问题描述】:

我正在使用ksh shell,下面是文件中的示例文本

AAA
ccc
ddd
eee
XXX
AAA
lll
mmm
eee
YYY

从上面的文本中,我只想打印AAAXXX 之间的行,最终输出将是这样的

AAA
ccc
ddd
eee
XXX

【问题讨论】:

    标签: shell sed ksh


    【解决方案1】:

    你可以使用sed 来完成这样的任务。它支持从匹配AAA 的行打印所有内容的语法,包括匹配XXX 的行。

    唉,您的输入格式有点不正确,因为起始模式 AAA 出现了两次,而第二个 AAA 没有匹配的 XXX。当在第二个AAA 之后找不到XXX 时,sed 默认行为是从第二个AAA 匹配到输入中的最后一行。详细信息在sed faq 的最后一节中进行了说明。

    但也有一个解决方案如何仅匹配第一个块:此代码直接取自常见问题解答并被您的问题采用:

    sed -n '/AAA/{:a; N;/XXX/! b a; p;} yourfile.txt'
    
    • /AAA//XXX/ 是 sed 表达式以匹配您的开始和结束行
    • /AAA/{:a;N;/XXX/! ba; ... } 是一个循环:从匹配 AAA 的行中找到它
      • 执行N 命令读取下一行
      • 如果该行与 /XXX/! 不匹配(注意 ! 否定匹配)它会分支返回 (b) 以标记 a 读取下一行。
      • 只有当行匹配XXX时,我们才离开分支循环并打印p

    如果您的输入对于每个 AAA 始终有一个匹配的 XXX 并且这些块没有嵌套,那么该命令会更加直观:

    sed -n '/AAA/,/XXX/ p' yourfile.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-28
      • 2023-01-13
      • 2020-09-11
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多