Você precisa de duas coisas para corresponder às quebras de linha (daí várias linhas) usando grep :
-
A opção
-
-zdo mais novo GNUgrep, fará com que as linhas sejam separadas por ASCII NUL em vez de quebras de linha -
(?s)é chamado modificador DOTALL (comgrep -P), fará com quegrepcorresponda às quebras de linha (LF / CR) por.(ponto)
Portanto, no seu caso, o seguinte deve funcionar:
grep -aPoz '(?s)<h2>.Some text' file.txt
Aqui . corresponderá à nova linha.
Se você tiver CR e LF (ou não), então:
grep -aPoz '(?s)<h2>.{1,2}Some text' file.txt
Como grep estava lendo os primeiros bytes para determinar o tipo de arquivo, portanto, o arquivo estava sendo tratado como um arquivo binário em grep , -a fará com que o arquivo seja tratado como um arquivo de texto.