Grep não pode usar -B com -v [duplicado]

1

Digamos que eu tenha file :

cat
dog
bird

Se eu executar cat file | grep dog -B 1 , obtenho:

cat
dog

Se eu executar cat file | grep dog -v , obtenho:

cat
bird

Espero que cat file | grep dog -v -B 1 retorne bird , mas em vez disso, ele age como grep dog sem sinalizadores.

Por que não consigo usar esses sinalizadores juntos?

grep (GNU grep) 2.16, também testado em 2.25 com os mesmos resultados

    
por Philip Kirkbride 16.11.2017 / 15:09

1 resposta

0

Eu só queria adicionar minha solução para obter o inverso de grep dog -B 1 :

cat file | grep "$(cat file | grep dog -B 1)" -v

Que retorna bird ao contrário do que cat file | grep dog -B 1 produz.

Parece que meu problema original era apenas entender mal como isso deveria funcionar. Eu estava pensando em aplicar -v iria simplesmente inverter qualquer comando grep .

Na verdade parece que o -v flag foi executado primeiro e depois -B 1 é aplicado depois, então todas as linhas que não contêm dog são retornadas e todas as linhas 1 antes dessas linhas, significando todas as linhas.

Edit: percebi que esta solução está errada. Não inverte porque o segundo grep usando o sub-shell não trata "$(cat file | grep dog -B 1)" como um único bloco de texto. Em vez disso, cada linha gerada é tratada como um grep diferente.

Se a subshell incluir:

cat
dog

E o arquivo original inclui outras instâncias de cat que não são 1 posição antes de dog , elas serão removidas para essa solução.

    
por 16.11.2017 / 15:23

Tags