Как искать несколько шаблонов в grep, игнорируя первый шаблон, если они появляются последовательно

Отказ от цветов - вы можете использовать:

# | piped at the end 
awk -F'SET timestamp=' 'NF > 1{ system("date -d @" $2) }'

Удаление цветов одновременно с сбросом делает эту задачу более сложной; Я подозреваю, что вы можете контролировать / регулировать это, удалив конечные включенные escape-последовательности, которые относятся к части timestamp .

0
08.02.2016, 01:59
3 ответа
grep -ozP  "(?s)(abc)[^(abc)]*(mno)" 1
abc
yyy
mno
abc
xxx
mno
0
29.04.2021, 00:18

На всякий случай perl - вариант для вас:

#!/usr/bin/env perl
# saved lines to print out
my @out = ();
# should we save lines?
my $saving = 0;
while (<>) {
  if (/abc/) {
    if ($saving) {
      # this is the second /abc/, so dump what we were saving and start over
      @out = ($_);
    } else {
      # this is the first /abc/, so save it and start saving lines
      push @out, $_;
      $saving = 1;
    }
  } elsif (/mno/) {
    if ($saving) {
      # print what we've saved, plus this /mno/ ending line, then reset
      print @out, $_;
      @out=();
      $saving=0;
    }
  } else {
    # otherwise, save lines if we should be
    push @out, $_ if $saving;
  }
}
1
29.04.2021, 00:18

Один из способов сделать это - развернуть файл с помощью tac, найти совпадения начинающиеся с mno и заканчивающиеся с abc, и развернуть их, чтобы получить желаемый результат. У меня получилось следующее:

$ tac test.txt | pcregrep -M 'mno(\n|.)*?abc' | tac
abc
yyy
mno
abc
xxx
mno

(Я использую pcregrep для многострочного флага -M)

1
29.04.2021, 00:18

Теги

Похожие вопросы