Como usar o resultado do grep na linha de comando?

3

Quando eu uso grep para encontrar algum texto que eu precise, ele exibirá linhas contendo uma correspondência para o padrão fornecido.

Por exemplo,

# grep -r ".*Linux" *
path0/output.txt:I hope you enjoyed working on Linux.
path1/output1.txt:Welcome to Linux.
path2/output2.txt:I hope you will have fun with Linux.

então, quero editar o arquivo path2/output2.txt , portanto, digito vim path2/output2.txt .

Mas não acho que seja uma maneira eficaz.

Como posso copiar o caminho depois de grep ?

    
por Gapry 24.08.2013 / 11:13

4 respostas

6

Estas são formas seguras para encontrar todos os arquivos com o Linux (caixa baixa e caixa alta).

xargs -a <(grep -rlZi Linux *) -0 vim
grep -rlZi Linux *| xargs -0 sh -c 'vim "$@" < /dev/tty' vim
grep -rlZi Linux *| xargs -0 vim # you need to run reset after this command 

Existem diferenças entre GNU xargs e BSD xargs, portanto, pode não funcionar no MacOSX.

  • As opções -Z e -0 são para nomes de arquivos delimitados por NULL
  • -l para gerar os nomes dos arquivos que correspondem.
  • -i corresponde a um valor inferior e superior.
  • -o em bsd xargs fará o mesmo que a parte "sh -c"
por 24.08.2013 / 11:24
5
vim 'grep -r ".*Linux" * | cut -f1 -d":"'

backticks são para substituição de comando. | é para saída de grep para cortar. -d":" diz corte baseado em : delimitado. -f1 diz o primeiro campo após o corte.

    
por 24.08.2013 / 11:20
2

Você pode aninhar seu comando grep como um argumento para vim ... . O comando grep produzirá a lista de arquivos como um único argumento para vim , quando ele for expandido. Além disso, você pode simplificar seus critérios de pesquisa para apenas ' Linux' para os exemplos fornecidos, não é necessário incluir o curinga .* .

Lista de arquivos

Este comando irá gerar a lista de arquivos para vim .

$ grep -lr ' Linux' *
path0/output.txt
path1/output1.txt
path2/output2.txt

Você pode aninhar isso dentro de um bloco de substituição de comandos ( $(..) ), assim:

$(grep -lr ' Linux' *)

Você pode usar echo para ver o que esta lista acabará procurando na linha de comando quando passada para vim :

$ echo $(grep -lr ' Linux' *)
path0/output.txt path1/output1.txt path2/output2.txt

Colocando tudo junto

$ vim $(grep -lr ' Linux' *)
3 files to edit
...

Com essa abordagem, você só precisa ter cuidado se sua lista de arquivos for extremamente longa. Mas, em geral, isso é altamente improvável.

    
por 24.08.2013 / 19:51
2

Bons editores permitem que você execute grep dentro.

No Vim, execute :grep -r ".*Linux" .

No Emacs, execute M-x grep e digite ".*Linux" -r .

    
por 26.08.2013 / 02:16

Tags