отображение содержимого файла от некоторого многострочного шаблона до конца

Как отобразить содержимое файла от некоторого многострочного шаблона до конца включая сам шаблон?

Я только что задал похожий вопрос, но он отличается, и я подумал, что должен опубликовать это как отдельный, новый вопрос. Поэтому, пожалуйста, не помечайте этот вопрос как дубликат просто из-за этого!

Например, если бы у меня был такой текстовый файл:

cat
dog
fox
cow
dove
bird
bunny
gnu
hen
dove
bird
buffalo

и если бы мой шаблон был таким:

dove
bird
bunny

то я бы хотел получить следующее:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

Мой реальный файл огромен, поэтому если есть несколько способов достичь этого, я бы предпочел более быстрые способы.

0
21.06.2017, 21:25
3 ответа

Если вы хотите печатать с первого появления шаблона, это легко сделать. Следуйте той же логике, которую я описал в другом ответе , но с некоторой дополнительной логикой:

parse.sed

/^dove$/ {            # Match multi-line pattern
  N                   #  /
  N                   # /
  /\nbird\nbunny$/bb  # When matched jump to label b
}
d                     # Restart with next line if no match
:b                    # \
n                     #  Print the rest of the file
bb                    # /

Запустите это так:

sed -f parse.sed infile

Или как переносной -вкладыш:

sed -n -e '/^dove$/{N;N;/\nbird\nbunny$/bb' -e '};d;:b' -e 'p;n;bb' infile

Выход в обоих случаях:

dove
bird
bunny
gnu
hen
dove
bird
buffalo
0
28.01.2020, 04:44

Вот Perl-решение:

perl -0777 -ne 'print $1,$2 if m/(dove.bird.bunny)(.*)/sm' myfile

Этот вывод:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

Переключатель -0777включает режим slurp , при котором весь файл считывается в память. использование модификаторов smдля соответствия позволяет точке соответствовать новой строке, при этом строка обрабатывается как несколько строк.

Переключатель -nсоздает цикл чтения входного файла. Когда видна последовательность dove.bind.bunny , она захватывается в $1с остальными строками в $2, и это то, что печатается, если полное совпадение успешно.

0
28.01.2020, 04:44

awkрешение:

awk -v RS=" " '{                        # considering space as record separator
                  for(i=1;i<=NF;i++) {  # iterating through all fields
                     if ($i=="dove" && $(i+1)=="bird" && $(i+2)=="bunny") { f=1 } 
                     if (f) print $i 
                  } 
               }' file

Выход:

dove
bird
bunny
gnu
hen
dove
bird
buffalo
0
28.01.2020, 04:44

Теги

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