Grep mantém (saída) o arquivo .txt inteiro se uma linha contiver string

Grep mantém (saída) o arquivo .txt inteiro se uma linha contiver string

eu sei que

grep -rhI "# Active" > out.txt 

irá gerar qualquer linha contida # Activeno diretório pesquisado, mas eu quero todo o conteúdo do arquivo .txt, por exemplo

exemplo.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

Então, se eu usar o grep, # Activequero que ele não apenas produza a linha que contém # Activeesse arquivo .txt, mas também todas as outras linhas, por exemplo

saída.txt

Line1 
Line2
Line3 # Active
Line4
Line5
etc

Responder1

Para versões não-GNU do grep, que provavelmente não terão -z, ou se a portabilidade for necessária...

grep -q pattern file && cat file

-qsuprime qualquer saída, mas, normalmente, o status de saída é definido com base no fato de uma correspondência de padrão ter sido encontrada ou não. Com uma correspondência de padrão grepretorna o código de sucesso 0que é equivalente averdadeiroe isso permite que o catcomando seja executado.

Responder2

Normalmente, grep mostrará apenas a linha correspondente:

$ grep -rhI "# Active"
Line3 # Active

Para ver o arquivo inteiro, adicione o -zsinalizador:

$ grep -rhIz "# Active"
Line1 
Line2
Line3 # Active
Line4
Line5
etc

-zé uma extensão GNU que diz ao grep para não usar nova linha como separador de 'linha', mas sim usar um caractere NUL. Como os arquivos de texto geralmente não possuem caracteres NUL, isso tem o efeito de dizer ao grep para ler o arquivo inteiro como se fosse uma única 'linha'. Conseqüentemente, se houver correspondência, todo o arquivo será impresso.

Nas versões BSD/OSX do grep, a opção de entrada NUL não está disponível e -zsignifica outra coisa.

As outras opções do grep

-rdiz ao grep para pesquisar arquivos e diretórios recursivamente.

-Idiz ao grep para ignorar arquivos binários

-hdiz ao grep para imprimir a correspondência sem o nome do arquivo anexado.

Responder3

sedalternativa:

sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile

este script funciona acumulando linhas no hbuffer antigo (e excluindo-as) até que uma linha correspondente seja encontrada, momento em que ele xaltera os buffers e executa n(ou seja, imprime e obtém a próxima linha) até que não haja mais entrada.

Responder4

Se você quiser fazer isso em vários arquivos:

cat `grep -rIl "# Active" *`

Grep retornará a lista de nomes de arquivos e cat irá imprimi-los.

informação relacionada