Como posso procurar por duas frases diferentes quando elas estão em duas linhas diferentes usando um único grep
comando?
Por exemplo
Linha 1: Isso é um doce.
Linha 2: limão.
Eu usei isso, mas nenhum resultado
grep "sweet.*lemon" file_type
Como posso procurar por duas frases diferentes quando elas estão em duas linhas diferentes usando um único grep
comando?
Por exemplo
Linha 1: Isso é um doce.
Linha 2: limão.
Eu usei isso, mas nenhum resultado
grep "sweet.*lemon" file_type
Respostas:
Para usar grep
para duas linhas diferentes, pesquise os 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 para um padrão de múltiplas linhas, isso é porque complicada grep
pensa em linhas ... . Você .*
vai pegar tudo entre "doce" e "limão" na linha . Podemos obter "limão" na próxima linha -P
usando \n
para corresponder à nova linha e dizendo que grep
o arquivo é nulo separado por -z
:
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
-E
Use expressões regulares estendidas (para usar |
caracteres para alternância sem precisar escapar)-An
Imprima linhas adicionais após o padrão, em que n é o número de linhas finais a serem impressas-P
Use expressões regulares no estilo perl (em vez de "experimental" em grep
install pcregrep
para obter melhor suporte ao perl regex)-z
Use o caractere nulo como separador (apenas fingindo neste caso, mas grep
aceitaremos nossa palavra)-o
imprima apenas a peça correspondente-o
... editado ...
grep: The -P and -z options cannot be combined
- por exemplo, grep (GNU grep) 2.5.1 no RHEL
Como isso:
grep "sweet\|lemon"
grep
por padrão, funciona no "modo padrão", onde "caracteres especiais" |
, como +
, *
são interpretados literalmente, a menos que sejam mascarados com uma barra invertida. Veja, por exemplo, esta resposta . Para usar do jeito que você provavelmente está acostumado, que "caracteres especiais" precisam ser mascarados para serem interpretados literalmente, você precisa mudar para o "modo estendido" ( grep -E
). Talvez madneon poderia elaborar um pouco mais sobre suas respostas, por exemplo o que os OPs tente iria ter acompanhado?
grep -zP
comando funcione nesse caso específico (um arquivo que consiste exatamente de duas linhas), em geral, qualquer arquivo separado por nova linha comum é uma única linha; portanto, despeje todo o conteúdo do arquivo (se houver uma correspondência em algum lugar) ou nada; geralmente não é para isso que as pessoas usamgrep
.