Comment canaliser le résultat d'une recherche grep dans un nouveau fichier vi

63

J'utilise grep -e Peugeot -e PeuGeot carlist.txtpour rechercher dans carlist.txt et extraire quelques éléments et je suppose que grep -e Peugeot -e PeuGeot carlist.txt | vicela me permettrait de le faire passer pour moi, mais voici ce que je reçois:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Lmedza
la source
si vous voulez inclure dans un fichier, je voudrais tout d' abord l' utilisation vi sur le fichier, puis: :read !grep -e Peugeot -e PeuGeot carlist.txt. :read !cmd...inclura la sortie de cmd ... dans le fichier (à l'emplacement du curseur)
Olivier Dulac
Ce que vous entendez par "fichier vi" n'est pas clair. Si vous voulez que la sortie soit dans un fichier, utilisez grep ... > /tmp/foo. Vous pouvez ajouter && vi /tmp/fooà la fin si vous souhaitez modifier ce fichier immédiatement.
LarsH
1
En fait, il n’existe pas de "fichier vi". vifonctionne sur des fichiers texte arbitraires; les fichiers eux-mêmes ne sont pas directement associés à vi. (Ou, comme je viens de l'apprendre, vi -fera vifonctionner le contenu de stdin; vimfait ceci, mais pas toutes les versions de le vifait.)
Keith Thompson

Réponses:

111

L'exécution de vi ou vim avec '-' en argument fait lire le fichier à éditer à partir de l'entrée standard. Par conséquent:

grep -e Peugeot -e PeuGeot carlist.txt | vi -

fera ce dont vous avez besoin.

Petr Uzel
la source
3
Pour ceux qui voient cela, attention: il attend de stdin. Dans certains cas, vous devrez rediriger de stderrvers stdin, par exemple:valgrind my_file.out 2>&1 | vi -
Ciro Costa le
Cela supprime les surlignages de recherche
MD. Mohiuddin Ahmed
3
@ MD.MohiuddinAhmed, comment comptez-vous conserver grepla coloration de recherche (composée de caractères non imprimables) dans Vim? Vous pouvez toujours faire une recherche dans Vim.
Wildcard
Je pensais que nous pouvions aller avec vim.org/scripts/script.php?script_id=302 au sein de vim.
MD. Mohiuddin Ahmed
11

Vous devriez utiliser la redirection de sortie :

grep ... > newfile.txt && vi newfile.txt

En outre, je pense que votre greppeut être amélioré:

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt
Joseph R.
la source
5

La redirection de sortie peut également être utilisée comme ceci:

vi <(grep ...)

Même plusieurs sorties de commande peuvent être redirigées, comme si elles avaient été enregistrées dans des fichiers séparés:

vim -d <(ls) <(ls -a)
musa
la source
1

Dans ~/bin/r:

#!/bin/sh
[ $# -eq 0 ] && set -- -;
exec vi -R "$@"

dans ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Ensuite:

ls |r
grep -e Peugeot -e PeuGeot carlist.txt | r

et j'ai

r- () { "$@" | r; }

dans mon ~/.bashrc,genre

r- ls -l
je vais
la source
0

Il existe de nombreux moyens efficaces de faire ce que vous voulez, que ce soit dans vi (m) ou en dehors de vi (m).

Exécutez votre commande, créez un fichier (temporaire), puis éditez-le ( voir la réponse de Joseph R. )

grep -e"Peu[gG]eot" carlist.txt && vi /tmp/peugeot.txt

Exécutez votre commande (en arrière-plan) pour générer un fichier temporaire et éditez-le à l'aide de ": e!" pour actualiser votre fichier au fur et à mesure de sa production (utile pour les fichiers journaux et les autres fichiers produits par un autre processus, par exemple cron?),

grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt &
vi /tmp/peugeot.txt

Exécutez vi (m), puis exécutez un processus enfant pour créer le fichier temporaire, puis lisez-le.

vi
:!grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt
:r /tmp/peugeot.txt

Ou, passez simplement au fichier,

:e /tmp/peugeot.txt

Exécutez vi (m) et utilisez le double-coup "!!" vi exécuter la commande enfant en prenant les résultats et en les insérant à l'emplacement actuel (écrase la ligne en cours, assurez-vous donc d'avoir une ligne vide),

vi
i
here
empty
there
<esc>
kk
!!grep -e "Peu[gG]eot" carlist.txt

Et maintenant, vous pouvez écrire le fichier (si vous le souhaitez) sous n’importe quel nom de fichier,

:w /tmp/someotherfilename.txt

Et la réponse de Petr Uzel est également bonne,

grep -e "Peu[gG]eot" carlist.txt | vi -

Qui lit stdin

ChuckCottrill
la source