web-dev-qa-db-fra.com

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

J'utilise grep -e Peugeot -e PeuGeot carlist.txt pour rechercher dans carlist.txt et extraire certains éléments et j'ai supposé que grep -e Peugeot -e PeuGeot carlist.txt | vi me le ferait passer, mais voici ce que j'obtiens:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
66
Lmedza

L'exécution de vi ou vim avec '-' comme argument lui 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.

114
Petr Uzel

Outre vim -, Vous pouvez également utiliser la substitution de processus en utilisant la syntaxe <(command), par exemple:

vim <(echo This is example.)
vim <(cat /etc/hosts)

Voir également:

12
kenorb

Vous devez utiliser redirection de sortie :

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

De plus, je pense que votre grep peut être amélioré:

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

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 étaient enregistrées dans des fichiers séparés:

vim -d <(ls) <(ls -a)
5
musa

Dans ~/bin/r:

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

dans ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

Alors:

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

et j'ai

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

dans mon ~/.bashrc, donc

r- ls -l
1
jthill

Il existe de nombreuses façons efficaces de faire ce que vous voulez, à l'intérieur de vi (m) ou à l'extérieur de vi (m).

Exécutez votre commande, créez un fichier (temporaire), puis modifiez le fichier ( 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 produire un fichier temporaire et modifiez le fichier en utilisant ": e!" pour actualiser votre fichier au fur et à mesure qu'il est produit (ceci est utile pour les fichiers journaux et d'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) et 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 "!!" pour que vi exécute la commande enfant, en prenant les résultats et en les insérant dans l'emplacement actuel (écrase la ligne actuelle, alors assurez-vous d'avoir une ligne vierge),

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) dans n'importe quel nom de fichier,

:w /tmp/someotherfilename.txt

Et réponse de Petr Uzel est également bon,

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

Qui lit de stdin

0
ChuckCottrill