【问题标题】:How to grep a unknown distance line above a pattern如何grep模式上方的未知距离线
【发布时间】:2015-07-18 20:03:01
【问题描述】:

很抱歉再次编辑问题。我发现我之前没有问清楚我的问题。
昨天问了a question 今天又发现了一个问题/.\
这是我的文件:

Time 00:00:01
kkk
lll
ccc
aaa: 88
...
Time 00:00:03
jjj
kkk
lll
ccc
aaa: 89
ooo
bbb
aaa
kkk
lll
ccc
aaa: 90
...
Time 00:00:04
kkk
lll
...

这是我想要的输出:

Time 00:00:01
kkk
lll
ccc
aaa: 88
Time 00:00:03
kkk
lll
ccc
aaa: 89
Time 00:00:03
kkk
lll
ccc
aaa: 90

上次我在寻找一条线和另一条线。这次我要找的是多行的模式:

kkk
lll
ccc
aaa: /any thing here/

还有一行

Time /any thing here/

从我昨天问的问题,我试过了

awk '/Time/{a=$0}/kkk\nlll\nccc\naaa/{print a"\n"$0}' file

perl -ane '$t=$_ if /Time/; print $t,$_ if /kkk\nlll\nccc\naaa/' test2

pcregrep.exe -M 'kkk.*(\n|.)lll.*(\n|.)ccc.*(\n|.)*aaa' test2

来自this 但它们不工作或输出不是我想要的。

我发现了一个像 this 这样的线程,它正在谈论状态机,但它很复杂,因为我有几行要匹配。

有什么可以轻松解决这个问题的建议吗?

【问题讨论】:

  • 您正在尝试输出以kkk 开头并以aaa 结尾的行集以及紧接着它们的Time 行?
  • 不仅如此,kkklllcccaaa 必须同时匹配,顺序相同。 Time 行会立即继续它们。

标签: regex perl awk


【解决方案1】:

(这个答案是为这个问题的第一个版本写的。)

$ awk -v RS="Time" -v p="\nkkk\nlll\nccc\naaa" '$0~p {print "Time",$1,p;}' file
Time 00:00:01 
kkk
lll
ccc
aaa
Time 00:00:03 
kkk
lll
ccc
aaa

(这可能需要 GNU awk。)

【讨论】:

  • 很抱歉,我错过了一个要求,我编辑了我的帖子,要求是如果Time 行下出现多个模式,那么我必须将它们全部打印出来。如何将此案例添加到命令中?还有 $0~p 是什么意思?
  • 如果当前记录 $0 包含与正则表达式 p 匹配的文本,则测试 $0~p 返回 true,其中 p 在命令行前面定义为您正在寻找。
  • 它可能不需要gnu awk,它需要gnu awk,因为RS中有多个字符
猜你喜欢
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 2014-04-14
相关资源
最近更新 更多