我的输入文件:
{empty line}
Test #1
data
{empty line}
Test #2
data
{empty line}
Test #3
{empty line}
Test #4
data
{empty line}
Test #5
预期输出:
1
2
4
如果使用简单的 bash 脚本在每个测试下都有可用数据,如何获取序列号(在主题标签之后)?
编辑:每个测试下的数据包含很少的值,例如日期、时间、差异等。两个Test之间有不止一根数据线。每个测试之间有一个空白行。“测试”数字始终是严格递增的正整数序列,从 1 开始。
这将做到:
更改要求并不好,但因为我喜欢拼图:如果文件有空行:
使用
sed
,您通常会在N;P;D
模式和使用保持空间之间进行选择:N;P;D
方法N
您可以通过在开头附加一个新行来使用该缓冲区来始终在缓冲区中有两个连续的行,P
只打印第一行并通过删除第一行来开始新的循环D
:$!N
如果这还不是最后一行,则追加下一行/\ndata/
匹配第二行为 的双行data
,!
反转匹配并D
开始下一个循环,仅缓冲区中的第二行。因此,如果第二行不以 开头data
,则继续下一行data
,因此s/.*#//
将删除直到 的所有内容#
,P
将打印第一行(现在只是数字),并D
为下一个循环删除第一行(小心连续data
的行!在这种情况下,您不知道该怎么做。保持空间方法
将带有要打印信息的行保留在
h
旧空间中,但仅在触发行上打印:/data/!
解决所有不包含data
. 将这些行放在h
旧空间中并d
elete 重新开始而不输出data
确实匹配,所以x
更改缓冲区以将保存的行保存到模式空间,删除最多的东西#
并s/.*#//
默认输出打印结果如果数据中没有主题标签:
一个更清晰的选择:
模式
(.*#)[0-9]+\n\1
跟踪带有主题标签的重复行。输出