grep E recurso de qualquer lugar na linha [duplicado]

0

Existe alguma maneira de grep ter um recurso AND? Quero dizer algo assim:

Eu tenho estas linhas:

I have this one line
I don't have this other line
I have this new line now
I don't have this other new line
This line is new

Por isso, quero que grep encontre linhas que contenham AMBAS as palavras "novo" e "linha", não apenas "nova linha". Eu sei que posso fazer isso assim:

grep new file | grep line

Mas não é isso que estou procurando. Eu estou olhando para fazer isso com um único comando grep . Isso ocorre porque esse script permite que o usuário insira os dois termos e um dos termos pode ser nulo, o que gera um erro grep e quebra o script.

    
por iamAguest 22.10.2018 / 10:55

3 respostas

1

Se o segundo termo estiver vazio ou não definido, não execute o segundo grep :

grep -e "$term1" <file |
if [ -n "$term2" ]; then
    grep -e "$term2"
else
    cat
fi

Isso aplica grep com o padrão em $term1 ao arquivo chamado file e, dependendo se $term2 não está vazio, aplica um segundo grep ao resultado ou usa cat como um filtro de passagem.

Observe que isso efetivamente implementa " term1 AND term2 ", exceto quando term2 está vazio no qual se degenera em apenas " term1 ".

Se preferir não executar grep e, em vez disso, retornar um resultado vazio quando o segundo termo estiver vazio:

if [ -n "$term2" ]; then
    grep -e "$term1" <file | grep -e "$term2"
fi

Isso efetivamente implementa " term1 AND term2 " e trata um term2 vazio como "falso".

O benefício disso é que ela depende apenas do padrão grep e de que os dois padrões são mantidos separados, o que facilita a compreensão e a manutenção.

    
por 22.10.2018 / 11:31
0

Isso funcionará (usando o GNU grep ):

grep -P '(?<=new)\s(?=line)' file

Teste:

$ cat > file
I have this one line
I don't have this other line
I have this new line now
I don't have this other new line
This line is new
^D

$ grep -P '(?<=new)\s(?=line)' file
I have this new line now
I don't have this other new line
    
por 22.10.2018 / 11:13
0

Tente o que man grep chama "Concatenação" combinada com "Alternação":

P1=line
P2=new
grep "$P1.*$P2\|$P2.*$P1" file
I have this new line now
I don't have this other new line
This line is new
    
por 22.10.2018 / 13:32

Tags