Comment utiliser le résultat grep dans la command line?

Lorsque j'utilise grep pour find du text dont j'ai besoin, il affichera les lignes contenant une correspondance avec le model donné.

Par exemple,

 # 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. 

puis, je veux éditer le file path2/output2.txt , par conséquent, je tape vim path2/output2.txt .

Mais, je ne pense pas que ce soit un moyen efficace.

Comment puis-je copyr le path après grep ?

Ce sont des moyens sûrs de find tous les files avec Linux (majuscules et minuscules).

 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 

Il y a des différences entre GNU xargs et BSOD xargs, donc cela pourrait ne pas marcher sur MacOSX.

  • Les options -Z et -0 sont pour les noms de files délimités par NULL
  • -l pour sortir les noms de files des files qui correspondent.
  • -i match inférieur et supérieur.
  • -o sur bsd xargs fera la même chose que la partie "sh -c"
 vim `grep -r ".*Linux" * | cut -f1 -d":"` 

les backticks sont pour la substitution de commands. | est pour la sortie de la tuyauterie de grep à couper. -d":" dit coupe basée sur délimité:. -f1 dit le premier champ après la coupe.

Vous pouvez imbriquer votre command grep comme argument pour vim ... La command grep produira la list des files en un seul argument pour vim , quand il sera développé. En outre, vous pouvez simplifier vos critères de search en ' Linux' uniquement pour les exemples que vous avez donnés, il n'est pas nécessaire d'inclure le caractère générique. .* .

Liste des files

Cette command générera la list des files pour vim .

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

Vous pouvez imbriquer ceci à l'intérieur d'un bloc de substitution de command ( $(..) ), comme ceci:

 $(grep -lr ' Linux' *) 

Vous pouvez utiliser echo pour voir ce que cette list finira par regarder sur la command line lorsqu'elle est transmise à vim :

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

Mettre tous set

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

Avec cette approche, il vous suffit de faire attention si votre list de files va être extrêmement longue. Mais en général, c'est hautement improbable.

De bons éditeurs vous permettent de lancer grep à l'intérieur.

Dans Vim, exécutez :grep -r ".*Linux" .

Dans Emacs, exécutez Mx grep et tapez ".*Linux" -r .