Estou pesquisando um arquivo de texto de várias linhas e desejo corresponder a uma string de uma determinada palavra até a primeira correspondência de outra palavra:
start
word1
word1
word1
word1
end
word2
word2
word2
start
word3
word3
word3
end
Aqui está o que eu uso:grep -Pzo "(?s)start.*?end" file.txt
E corresponde a tudo na string de texto acima do começo ao fim, enquanto eu quero corresponder apenas até a primeira end
ocorrência, ou seja:
start
word1
word1
word1
word1
end
O que estou fazendo de errado?
De alguma forma, o quantificador não ganancioso ?
não está funcionando como eu esperava.
Obrigado pelo seu tempo e contribuições!
Uma correspondência gananciosa incluiria tudo do primeiro
start
ao últimoend
, assim:O que você está realmente vendo são duas correspondências não gananciosas separadas, produzidas em "linhas" separadas de acordo com a
-o
opção - exceto que com-Z
, as "linhas" são realmente denotadas pelo caractere nulo em vez do caractere de nova linha:Como não podemos ver o byte nulo aqui, fica mais claro se você adicionar
-b
para indicar os deslocamentos de byte das duas correspondências dentro da "linha":Como as
-o
saídas são separadas por nulo, você pode canalizar o resultadohead -z
para obter apenas a primeira correspondência:Alternativamente, você pode usar o próprio perl
que imprime apenas uma correspondência, apesar do
for
loop, pois og
sinalizador é omitido.