#1 Le 19/06/2017, à 14:46
- DonutMan75
[RESOLU] Commande vim/ex pour sauvegarder sur pattern ?
Bonjour,
J'ai une petite question très précise sur vim.
Voilà, je souhaite sélectionner l'ensemble des lignes qui matchent un pattern et les sauvegarder dans un deuxième fichier.
$ cat texte.txt
ROUGE ligne 01
VERT ligne 02
BLEU ligne 03
ROUGE ligne 04
VERT ligne 05
BLEU ligne 06
Je voudrais obtenir :
$ cat rouge.txt
ROUGE ligne 01
ROUGE ligne 04
Dans vim, je pensais faire :
:g/ROUGE/w ./rouge.txt
Mais ça me sort
E13: File exists (add ! to override)
Le fichier "rouge.txt" n'existait pourtant pas avant exécution de cette commande.
Et au final, rouge.txt est exactement égal à texte.txt..
Quelqu'un peut-il m'expliquer pourquoi ma méthode ne fonctionne pas ?
Il y a sans doute d'autres façons, sans doute plus naturelles mais j'aimerais bien découvrir ce que je n'ai pas compris dans la logique de :g ^^
EDIT :
La bonne commande est
:g/ROUGE/ .w! ./rouge.txt
Explications ci-dessous
Merci d'avance
Donut
Dernière modification par DonutMan75 (Le 20/06/2017, à 12:46)
Hors ligne
#2 Le 19/06/2017, à 17:04
- pingouinux
Re : [RESOLU] Commande vim/ex pour sauvegarder sur pattern ?
Bonjour,
Essaye ceci :
:!grep ROUGE % >./rouge.txt
Hors ligne
#3 Le 19/06/2017, à 20:01
- DonutMan75
Re : [RESOLU] Commande vim/ex pour sauvegarder sur pattern ?
Hello,
et (derechef) merci pour ta réponse
Je n'ai pas encore rencontré la syntaxe :! mais je suppose que je vais tomber dessus dans les prochains chapitres
Bonne soirée et à bientôt !
Donut
Dernière modification par DonutMan75 (Le 19/06/2017, à 20:01)
Hors ligne
#4 Le 19/06/2017, à 20:14
- pingouinux
Re : [RESOLU] Commande vim/ex pour sauvegarder sur pattern ?
La commande bash qui suit le ! est exécutée.
% est remplacé par le nom du fichier qui est édité.
Dernière modification par pingouinux (Le 19/06/2017, à 20:16)
Hors ligne
#5 Le 19/06/2017, à 20:24
- grigouille
Re : [RESOLU] Commande vim/ex pour sauvegarder sur pattern ?
Une autre possibilité (parmi d'autres)
:g/ROUGE/t$
Et tu n'as plus qu'à faire le copier-coller qui va bien.
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#6 Le 20/06/2017, à 10:38
- DonutMan75
Re : [RESOLU] Commande vim/ex pour sauvegarder sur pattern ?
Hello,
en bidouillant j'ai trouvé une autre solution qui marche, mais il faut que le fichier rouge.txt existe préalablement (quitte à être vide via $touch rouge.txt) :
:g/ROUGE/ .w >> ./rouge.txt
En faisant ça, ça marche comme il faut.
J'interprète cette commande comme :
on cherche toutes les lignes qui le pattern "ROUGE"
on write la ligne courante, notée '.' et qui est donc la nième ligne trouvée, en append ('>>') dans rouge.txt
Si le fichier rouge.txt n'existe pas, j'ai une erreur E212 : "Can't open file for writing"
C'est dommage on a pas le même comportement que le shell. En effet, si rouge.txt n'existe pas, on peut très bien faire
$ echo "rouge" >> ./rouge.txt
$ cat ./rouge.txt
rouge
$
A noter que si je fais :
:g/ROUGE/ .w ./rouge.txt
Il ne m'écrit que la première occurence de ROUGE trouvée et ensuite génère une erreur 13 "File exists (add ! to override)". C'est attendu vu que dès la 2eme occurence il essaie d'écraser le fichier rouge.txt préalablement créé.
Et si on fait :
:g/ROUGE/ .w! ./rouge.txt
Alors dans ce cas, à chaque itération de 'g' il écrase ./rouge.txt. In fine, on se retrouve avec la dernière occurence de ROUGE trouvée.
Qu'en pensez-vous ?
Donut
Hors ligne
#7 Le 20/06/2017, à 11:00
- pingouinux
Re : [RESOLU] Commande vim/ex pour sauvegarder sur pattern ?
Ta méthode m'a donné l'idée d'essayer autre chose :
:g/ROUGE/ .w! >> ./rouge.txt
Pas de message d'erreur, que rouge.txt existe ou pas. Évidemment, si ce fichier contient déjà quelque chose, la commande ne l'efface pas, mais ajoute les lignes à la fin.
Hors ligne
#8 Le 20/06/2017, à 11:39
- grigouille
Re : [RESOLU] Commande vim/ex pour sauvegarder sur pattern ?
Encore une autre méthode :
Vider le registre a
qaq
grep ROUGE et ajouter au registre a:
:g/ROUGE/yank A
Ouvrir (ou créer) le fichier rouge.txt
:e rouge.txt
Coller le registre a
"ap
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#9 Le 20/06/2017, à 12:16
- DonutMan75
Re : [RESOLU] Commande vim/ex pour sauvegarder sur pattern ?
Bonjour à vous,
pingouinux super cette commande marche nickel !
gribouille, si je comprends bien on utilise ici "yank" au lieu de "co" car yank peut copier dans un registre (mais pas co, ça génère une erreur) ?
Je me demande s'il n'est pas possible d'écrire le contenu d'un buffer directement dans un fichier sans passer par [:e fichier / "ap]
Merci en tout cas pour vos retours, je deviens progressivement un enthousiaste de vim (j'aurai du m'y mettre plus tôt).
Il est possible de faire la même action de différente façon possible.
Bonne aprem à tous !
Donut
Hors ligne
#10 Le 20/06/2017, à 12:57
- grigouille
Re : [RESOLU] Commande vim/ex pour sauvegarder sur pattern ?
:copy (:co) copie vers une adresse. Cela ne peut pas fonctionner ici. Mais je peux me tromper.
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne