Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

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

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 smile
Je n'ai pas encore rencontré la syntaxe :! mais je suppose que je vais tomber dessus dans les prochains chapitres smile

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 :

  1. on cherche toutes les lignes qui le pattern "ROUGE"

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