Como posso procurar por duas frases diferentes quando elas estão em duas linhas diferentes usando um único grepcomando?
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 grepcomando?
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 greppara 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 greppensa em linhas ... . Você .*vai pegar tudo entre "doce" e "limão" na linha . Podemos obter "limão" na próxima linha -Pusando \npara corresponder à nova linha e dizendo que grepo arquivo é nulo separado por -z:
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
-EUse 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-PUse expressões regulares no estilo perl (em vez de "experimental" em grepinstall pcregreppara obter melhor suporte ao perl regex)-zUse o caractere nulo como separador (apenas fingindo neste caso, mas grepaceitaremos 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"
greppor 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 -zPcomando 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.