Comment puis-je ouvrir un fichier résultant de grep?

17

Je grep souvent un tas de fichiers pour trouver une ligne, puis grep renvoie un résultat. Plutôt que de copier et coller le nom de fichier dans une nouvelle commande, j'aimerais pouvoir ouvrir ce résultat avec un éditeur. Quelque chose comme: grep foo | vim. Existe-t-il un moyen de le faire en BASH?

Jonathan
la source
5
Vous étiez plutôt proche, dites simplement vimde lire à partir de STDIN:grep foo | vim -
devnull
2
Voir aussi unix.stackexchange.com/q/110146/22565
Stéphane Chazelas

Réponses:

20

Utilisez grep -lpour obtenir simplement le nom de fichier du fichier correspondant et non le texte correspondant, puis combinez-le avec vim:

vim "$(grep -l some_pattern file_names)"
Anthon
la source
De plus, vous pouvez utiliser l' -qindicateur de greppour vous assurer que grep a bien abouti à un fichier correspondant:grep -q patterns fnames && vim $(grep -l pattern fnames)
mkc
Dois-je faire une remarque sur les noms de fichiers avec des espaces?
Bernhard
@Bernhard Cela ne peut jamais faire de mal, et aussi pour ceux qui ont des nouvelles lignes et d'autres caractères spéciaux. Je reconnais le problème lorsque se viplaint, l'OP pourrait ne pas.
Anthon
Ne fonctionne pas si les fichiers correspondants ont des espaces sur leur chemin
psuzzi
5

Vous pouvez utiliser quickfixou errorfilefigurer dans vim:

$ grep -n foo * > /tmp/foo.list
$ vim -q /tmp/foo.list

Vim ouvrira le premier fichier /tmp/foo.listet placera le curseur directement sur la ligne où il a fooété trouvé. Vous pouvez passer à l'instance suivante en utilisant :cnet à l'instance précédente en utilisant :cp.

Note latérale : Si vous utilisez déjà vimou gvim, je suggère d'utiliser sa grepfonctionnalité intégrée . Lisez :help vimgreppour plus d'informations.

Srinidhi
la source
1

Pour la recherche dans le projet, pas besoin de quitter vim avec Fugitive

autocmd QuickFixCmdPost *grep* cwindow

Ci-dessous, vous pouvez voir un exemple de :Ggrep config

entrez la description de l'image ici

goodniceweb
la source
0

EDIT: Après avoir lu votre commentaire, je me rends compte que je n'ai pas compris la question au départ. Voici un script simple qui prend votre terme de recherche comme argument et vous demande le chemin de recherche. Si le résultat se trouve dans un seul fichier, il ouvre le fichier pour modification à l'emplacement du résultat de la recherche.

#!/bin/bash

SRCHTRM="$1"

read -p "Where to search: " SRCHPATH

FILEFOUND=$(grep "$SRCHTRM" $SRCHPATH)
FILEFOUNDCNT=$(grep "$SRCHTRM" $SRCHPATH | wc -l)

FILEAWK=$(echo "$FILEFOUND" | awk -F":" '{ print $1 }')

if [ "$FILEFOUNDCNT" -eq "1" ];then
    vi +/"$SRCHTRM" "$FILEAWK"
else
    echo "$1 was found in more than one file"
fi
Timothy Martin
la source
Mais cela semble me permettre d'éditer la sortie de grep, mais ce que je veux faire, c'est éditer le fichier avec le nom de fichier renvoyé par grep.
Jonathan
0

@devnull a eu la bonne réponse dans ce commentaire:

Vous étiez plutôt proche, dites simplement à vim de lire depuis STDIN:

grep foo | vim -

Noumenon
la source
0

Pour développer la réponse d'Anthon pour un cas où vous avez plus d'une correspondance, il peut être utile dans certains cas d'utiliser head -1(à partir de cette réponse ) pour sélectionner uniquement le premier résultat:vim "$(grep -l STRING FILES|head -1)"

EL_DON
la source
0

Si vous effectuez une commande longue avec grep quelque part au milieu, vous pouvez également faire

vim `command1 | grep whatever | awk '{do_something_else}'`
Greg
la source