Como usar o grep para 2 linhas diferentes

11

Como posso pesquisar duas frases diferentes quando elas estão em duas linhas diferentes usando um único comando grep ?

Por exemplo

Linha 1: isso é um doce.

Linha 2: limão.

Eu usei isso, mas nenhum resultado

grep "sweet.*lemon" file_type
    
por Vijay Chakraborty 10.12.2016 / 08:49

2 respostas

17

Para usar grep para duas linhas diferentes, pesquise pelos dois padrões

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

Ou use alternância

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

Para obter a próxima linha após um padrão, você pode usar a opção de contexto

$ grep -A1 sweet file_type
This is a sweet
lemon.

Mas se você estiver procurando explicitamente por um padrão multilinha, isso é complicado porque grep pensa em linhas ... . Seu .* vai pegar tudo entre "doce" e "limão" na linha . Podemos obter "limão" na próxima linha com -P usando \n para corresponder à nova linha e informando grep o arquivo é nulo separado com -z :

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Notas:

  • -E Use expressões regulares estendidas (para usar o caractere | para alternação sem precisar fugir dela)
  • -An Imprime linhas adicionais depois do padrão, onde n é o número de linhas à direita para imprimir
  • -P Use expressões regulares no estilo perl ("experimental" em grep - install pcregrep para melhor suporte a regex em perl)
  • -z Use o caractere nulo como separador (apenas fingindo neste caso, mas grep aceitará nossa palavra)
  • -o imprime apenas a parte correspondente
por Zanna 10.12.2016 / 08:58
5

Assim:

grep "sweet\|lemon"
    
por madneon 10.12.2016 / 08:57