如何在一条线之前用一个未知距离的线

时间:2015-05-07 09:42:57

标签: regex bash

我知道我可以在特定模式的上方和下方涂抹线条,例如this 现在我有一个问题,我想在一定的模式之前插线,但我不知道它有多远,例如:

Time 00:00:01
kkk
lll
aaa
...
Time 00:00:03
kkk
kkk
kkk
lll
lll
aaa
aaa
...
Time 00:00:04
kkk
lll
...

我的目标模式是aaa,另一种模式是"时间xx:xx:xx"我希望输出像这样

Time 00:00:01
aaa
Time 00:00:03
aaa
aaa

Time 00:00:01
aaa
Time 00:00:03
aaa
Time 00:00:03
aaa

我该怎么做?

4 个答案:

答案 0 :(得分:4)

确切输出

awk '/^Time/{a=$0;x=0}/aaa/{print (x++?"":a"\n") $0}' file

Time 00:00:01
aaa
Time 00:00:03
aaa
aaa

Element.findall()

答案 1 :(得分:3)

您可以使用以下内容:

(Time[^\n]*|aaa)

https://regex101.com/r/cY8jN7/2

grep中使用同样的事情:

Time[^\n]*|aaa

编辑:这个正则表达式将替换除了你需要的所有东西,所以输出是正确的:

Time[^\n]*\n((?:(?!Time|aaa)[^\n]*(\n|$))*(?=Time|$))|(?<=\n)(?!Time|aaa)[^\n]+\n

https://regex101.com/r/xP1hT0/1

答案 2 :(得分:2)

以下是在Perl中执行此操作的方法:

perl -ane '$t=$_ if /Time/; print $t,$_ if /aaa/' file

答案 3 :(得分:0)

使用grep非常简单:

$ grep -E 'Time |aaa' file

匹配器选择

-E, - extended-regexp            将PATTERN解释为扩展正则表达式(ERE,请参阅            下面)。 (-E由POSIX指定。)