Как отобразить содержимое файла от некоторого многострочного шаблона до конца включая сам шаблон?
Я только что задал похожий вопрос, но он отличается, и я подумал, что должен опубликовать это как отдельный, новый вопрос. Поэтому, пожалуйста, не помечайте этот вопрос как дубликат просто из-за этого!
Например, если бы у меня был такой текстовый файл:
cat
dog
fox
cow
dove
bird
bunny
gnu
hen
dove
bird
buffalo
и если бы мой шаблон был таким:
dove
bird
bunny
то я бы хотел получить следующее:
dove
bird
bunny
gnu
hen
dove
bird
buffalo
Мой реальный файл огромен, поэтому если есть несколько способов достичь этого, я бы предпочел более быстрые способы.
Если вы хотите печатать с первого появления шаблона, это легко сделать. Следуйте той же логике, которую я описал в другом ответе , но с некоторой дополнительной логикой:
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
Вот 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
, и это то, что печатается, если полное совпадение успешно.
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