Obtenha todas as correspondências regex entre dois padrões e imprima-os para o arquivo

4

Eu tenho um arquivo com várias linhas longas. Eu gostaria de pegar todos os grupos entre dois padrões e imprimi-los em um novo arquivo, um jogo por linha. Consegui fazer isso com o Python, mas prefiro usar apenas ferramentas de linha de comando para essa tarefa. Se não houver padrão final, gostaria de pegar tudo até o final da linha.

Algo como:

input: 
xxSTART relevanttext xxEND something else xxSTART even more relevant

output:
relevanttext
even more relevant
    
por user48020 26.09.2013 / 21:25

1 resposta

6

Se o GNU grep for uma opção, você pode passar o sinalizador -P (perl-compatible regex) e usar declarações antecipadas, asserções de aparência e combinações não-gananciosas para extrair o que você precisa

echo 'xxSTART relevanttext xxEND something else xxSTART even more relevant'  |\
grep -oP '(?<=START).*?(?=xxEND|$)'
relevanttext
even more relevant

Ou, como sugere Stephane Chazelas, use o interessante \ K no lugar da aparência por trás da afirmação

echo 'xxSTART relevanttext xxEND something else xxSTART even more relevant'  |\
grep -oP 'START\K.*?(?=xxEND|$)' 
    
por 26.09.2013 / 21:34