Eu tenho tentado encontrar uma maneira de filtrar uma linha que contenha a palavra "limão" e "arroz". Eu sei como encontrar "limão" ou "arroz", mas não os dois. Eles não precisam estar próximos um do outro, apenas um na mesma linha de texto.
text-processing
grep
Sebastian
fonte
fonte
Respostas:
"Ambos na mesma linha" significam "'arroz' seguido de caracteres aleatórios seguidos de 'limão' ou o contrário".
Em regex que é
rice.*lemon
oulemon.*rice
. Você pode combinar isso usando um|
:Se você deseja usar regex normal em vez de estendidos (
-E
), precisará de uma barra invertida antes de|
:Para mais palavras que rapidamente se tornam um pouco mais longas e geralmente é mais fácil usar várias chamadas
grep
, por exemplo:fonte
grep rice
encontra as linhas que contêmrice
. Ele é alimentado nogrep lemon
qual somente serão encontradas linhas contendo limão ... e assim por diante. Considerando que o OP -, bem como as suas respostas anteriores - estão permitindo que qualquer de [arroz | limão | frango]|
precisa ser evitadogrep
? Obrigado!egrep
usa regex estendido, onde|
é entendido como lógica OR.grep
o padrão é o regex básico, onde\|
está OR #grep
de manual,egrep
está obsoleto e deve ser substituído porgrep -E
. Tomei a liberdade de editar a resposta de acordo.Você pode canalizar a saída do primeiro comando grep para outro comando grep e isso corresponderia aos dois padrões. Então, você pode fazer algo como:
ou,
Exemplo:
Vamos adicionar alguns conteúdos ao nosso arquivo:
O que o arquivo contém:
Agora, vamos cumprimentar o que queremos:
Nós só obtemos as linhas onde ambos os padrões correspondem. Você pode estender isso e canalizar a saída para outro comando grep para outras correspondências "AND".
fonte
Embora a pergunta solicite 'grep', achei útil postar uma solução simples 'awk':
Isso pode ser facilmente estendido com mais palavras ou outras expressões booleanas além de 'e'.
fonte
Outra idéia para encontrar as correspondências em qualquer ordem é usar:
grep com a opção
-P
(Perl-Compatibility) e regex lookahead positivo(?=(regex))
:ou você pode usar abaixo:
.*?
meio que corresponde a qualquer caractere.
que ocorra zero ou mais vezes*
enquanto opcional, seguido de um padrão (rice
oulemon
). O?
faz tudo opcional antes (meio zero ou um tempo de tudo combinado.*
)(?=pattern)
: Lookahead positivo: o construto lookahead positivo é um par de parênteses, com o parêntese de abertura seguido de um ponto de interrogação e um sinal de igual.Portanto, isso retornará todas as linhas com contém ambos
lemon
erice
em ordem aleatória. Além disso, isso evitará o uso de|
s e o dobro degrep
s.Links externos: Tópicos avançados de Grep Lookahead positivo - GREP para designers
fonte
Retornará correspondências para foo ou goo
fonte
Se admitirmos que
grep
é aceitável fornecer uma resposta que não seja baseada, como a resposta acimaawk
, eu proporia umaperl
linha simples como:A pesquisa pode estar ignorando o caso com algumas / todas as palavras como
/lemon/i and /rice/i
. Na maioria das máquinas Unix / Linux, o perl é instalado e o awk de qualquer maneira.fonte
Aqui está um script para automatizar a solução de tubulação grep:
fonte
eval
ing-lo, o que quebra facilmente