regex - awk - 如果下一行与模式不匹配则删除行

标签 regex bash awk

我想解决以下问题,到目前为止,我认为 awk 可能也是正确的,但如果我错了,请证明我。

我有一个遵循此方案的控制台输出:

HEADER: HeaderInfo1
Details 1
Details 2
HEADER: HeaderInfo2
HEADER: HeaderInfo3
Details 3
Details 4
HEADER: HeaderInfo4

我想将其转换为以下内容:

HeaderInfo1: Details 1
HeaderInfo1: Details 2
HeaderInfo3: Details 3
HeaderInfo3: Details 4

如您所见,每个 Detail 都属于最近的标题。每个标题的详细信息数量是可变的 应忽略空标题。

我尝试了各种正则表达式和 sed 魔法,但我认为这似乎是 awk 的情况。但是我不太清楚从哪里开始。

最佳答案

假设您的信息在名为 info 的文件中:

$ awk '/^HEADER/{hdr=$2;next} {print hdr": "$0}' info
HeaderInfo1: Details 1
HeaderInfo1: Details 2
HeaderInfo3: Details 3
HeaderInfo3: Details 4

说明

awk 程序分为两部分:

  • /^HEADER/{hdr=$2;next}

    对于以HEADER开头的行,第二个字段保存在变量hdr中,然后指示awk跳到下一个行。

  • {print hdr": "$0}

    对于所有其他行,打印 header hdr 的最新值,后跟一个冒号,然后是行 ($0)。

    <

关于regex - awk - 如果下一行与模式不匹配则删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25758728/

相关文章:

java - 将字符串与多个正则表达式模式匹配并返回组编号

PHP 从 url 获取版本

linux - 如果远程服务器上不存在文件或磁盘已满,则从子 shell 退出 shell 脚本?

linux - 使用 grep 时如何跳过第一行和最后一行?

regex - 用点分隔符分割 UNIX 字符串并存储在变量中

java - 用于终止 > 和 < 之间所有字符的正则表达式

Java - 如果单词以用户输入的定界符结尾,则执行 x

bash - 代入局部变量时函数的返回值

linux - Bash 脚本未同步运行

awk - 如何在 csv 文件中替换管道而不是逗号