OVH Cloud OVH Cloud

[vi]Inversion de mot

4 réponses
Avatar
jeje900ss
Bonjour tout le monde,

J'ai un fichier dont chaque ligne contient 2 mots et j'aimerais inverser
ces 2 mots pour chacune des ces lignes.

exemple :
toto1 tata1
toto2 tata2
toto3 tata3

>

tata1 toto1
tata2 toto2
tata3 toto3

Est ce que c'est possible de faire ça avec vi ?
Du genre inverser le mot 1 trouver par une regexp avec le mot 2 trouver
par une autre regexp.

Question secondaire, quelle différence entre le sustitute de sed et le
substitute de vi ?

merci pour vos réponses

Jérôme

4 réponses

Avatar
Stephane Zuckerman
J'ai un fichier dont chaque ligne contient 2 mots et j'aimerais inverser
ces 2 mots pour chacune des ces lignes.

exemple :
toto1 tata1
toto2 tata2
toto3 tata3




tata1 toto1
tata2 toto2
tata3 toto3


s/([:alpha:]+) ([:alpha:]+)/2 1/
(pas testé, mais je suppose que vi connaît les classes de regexp POSIX.
Sinon, [:alpha:] == [a-zA-Z0-9_] si je me souviens bien).

Du genre inverser le mot 1 trouver par une regexp avec le mot 2 trouver
par une autre regexp.


Hein ?

--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)


Avatar
Fred
Bonjour tout le monde,

J'ai un fichier dont chaque ligne contient 2 mots et j'aimerais inverser
ces 2 mots pour chacune des ces lignes.

exemple :
toto1 tata1
toto2 tata2
toto3 tata3




tata1 toto1
tata2 toto2
tata3 toto3

Est ce que c'est possible de faire ça avec vi ?
[...]

Jérôme


Si c'est pour un seul fichier et que tu ne veux pas l'intéger à un
script shell, tu peux utiliser une macro vi :

:map v 0dwA ^[pj

Si tu n'est pas familier avec les les macros, le ^[ est en fait obtenu
en tapant ctrl V Esc

Une fois la macro entrée, tu l'appelles en tapant simplement v et en le
répétant autant de fois qu'il y a de lignes.

A+

Fred


Avatar
jeje900ss
Stephane Zuckerman wrote:
J'ai un fichier dont chaque ligne contient 2 mots et j'aimerais inverser
ces 2 mots pour chacune des ces lignes.

exemple :
toto1 tata1
toto2 tata2
toto3 tata3


tata1 toto1
tata2 toto2
tata3 toto3



s/([:alpha:]+) ([:alpha:]+)/2 1/
(pas testé, mais je suppose que vi connaît les classes de regexp POSIX.
Sinon, [:alpha:] == [a-zA-Z0-9_] si je me souviens bien).



Merci beaucoup.
la commande exacte était :
:%s/([[:alpha:]]+) ([[:alpha:]]+)/2 1/



Du genre inverser le mot 1 trouver par une regexp avec le mot 2 trouver
par une autre regexp.



Hein ?


Je voulais dire comment faire références aux expressions afin de les
inverser. Et d'aprés ta réponse j'en déduit que ça se fait avec n ou n
fait référence à la n ième expression entre parenthèse.

D'ailleur aprés coup je suis tombé la dessus ou tout est expliqué :
http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_03_06

Jérôme


Avatar
jeje900ss
Fred wrote:

Bonjour tout le monde,

J'ai un fichier dont chaque ligne contient 2 mots et j'aimerais inverser
ces 2 mots pour chacune des ces lignes.

exemple :
toto1 tata1
toto2 tata2
toto3 tata3




tata1 toto1
tata2 toto2
tata3 toto3

Est ce que c'est possible de faire ça avec vi ?
[...]

Jérôme



Si c'est pour un seul fichier et que tu ne veux pas l'intéger à un
script shell, tu peux utiliser une macro vi :

:map v 0dwA ^[pj

Si tu n'est pas familier avec les les macros, le ^[ est en fait obtenu
en tapant ctrl V Esc

Une fois la macro entrée, tu l'appelles en tapant simplement v et en le
répétant autant de fois qu'il y a de lignes.


J'ai testé, ça marche bien. Jolie :-)
J'avais pas du tout pensé à cette méthode. Je m'était focalisé sur la
substitution et les expressions régulières.

Comme ça avec cette question j'aurai appris 2 choses

Merci

Jérôme