Vi et cygwin

CYG -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
je veux remplacer 2 chaines de caractéres(NUMMASTER et NUMSLAVE) par 2 autres dans une trentaines de fichiers "doris1.in" dans des sous répertoires différents, pour cela j ai écrit un script test.sh qui contient les commandes suivantes:
cd 19920505_19950901
vi doris1.in
:%s/NUMMASTER/19920505
:%s/NUMSLAVE/19950901
:wq
cd ../19920505_19971015
vi doris1.in
:%s/NUMMASTER/19920505
:%s/NUMSLAVE/19971015
:wq
.
.
.
. idem pour les trentaines de fichier

quand j excute mon script (./test.sh) cygwin m affiche les erreurs suivantes:
./test.sh line3:%s/NUMMASTER/19920505: No such file or directory
./test.sh line4:%s/NUMSLAVE/1995090: No such file or directory
./test.sh line5:wq : command not found
.
.
.
. idem pour les autres lignes
quelqu un peut m aider, ça me déprime ce probléme, 6h sans résultat, j ai cherché partt mais pas trouvé qrand chose

merci d avance
Configuration: Windows 2003
Firefox 2.0.0.9

16 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Tu tiens vraiment à faire ça avec "vi" ?
    Parce qu'il y a des solutions bien plus aisées, notamment avec "ed" ou "sed"...

    ;-))
    0
    1. CYG
       
      salut,
      merci pour votre réponse;
      mon obejectifs c est de remplacer les chaînes de caractére par d autres chaînes, dans plusieurs fichiers appartenant à différents sous répértoires, quelque soit le moyen (vi, emacs, ed, sed), donc si vous connaissez une commande sur sed ou ed qui me facilite la tâche, je vous serais reconnaissant de m aider

      CYG
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-

    Essaie ça dans un 1er temps :
    find . -type f -name "doris1.in" -exec sed 's/NUMMASTER/19920505/;s/NUMSLAVE/19971015/' {} \;
    Si la sortie sur l'écran est satisfaisante, rajoute le switch "-i" à sed (sed -i 's/.../.../') pour une modification définitive. Bien évidemment ta version de "sed" doit être supérieure à 4.0.5 pour que le switch "-i" soit implémenté.
    0
    1. CYG
       
      merci;
      j ai essayé cette commande, mais cygwin me lance une erreur
      find : missing argument to '-exec'
      ça veut dire quoi ce message???
      vous savez comment le résoudre??
      GYG
      0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Sed est installé au moins ?
    0
  4. CYG
     
    oui, puisque j ai déja sed.exe, et quand je met la commande man sed, cygwin me donne plein d infos sur sed
    dsl mais je suis encore débutant
    CYG
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    T'as bien tapé la commande comme donnée ci-dessus, sur une seule ligne, et sans oublié le "\;" à la fin ???
    0
    1. CYG
       
      merci bcp;
      ça marche bien pour un fichier; mnt je veux bien écrire un script qui contient une trentaine de ligne et chaque ligne présente cette commande (find . -type f -name "doris1.in" -exec sed 's/NUMMASTER/19920505/;s/NUMSLAVE/19971015/' {} \;)
      ce qui va changer ce sont les dates pour NUMMASTER et NUMSLAVE, et les sous répertoires
      j ai une idée, mais ça marche pas, puisque dans la commande ya (") et (');
      gawk '{print "cd ../" $0 "\n" "find . -type f -name" "doris1.in" "-exec sed 's/NUMMASTER/"substr($0,0,8)"/"";s/NUMSLAVE/"substr($0,10,0)"/""' {} \;"}' liste_orb_Couples.txt > test
      le fichier iste_orb_Couples.txt contient les noms des sous répertoires par exemples (19920505_19971015\n19930714_19980410)
      vous pouvez m aider???
      CYG
      0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Qu'on se comprenne bien, il faut affecter à chaque variable NUMMASTER et NUMSLAVE respectivement la valeur de part et d'autre de l'underscore de chaque sous-répertoire ?

    sous_rép=19920505_19971015
    NUMMASTER=19920505
    NUMSLAVE=19971015

    c'est bien ça ?
    0
    1. CYG
       
      oui, c est ça
      par exemple
      dans le sous répertoire :19920505_19971015; j ai un certain fichier doris1.in, ce dernier contient les chaînes de caractéres NUMMASTER et NUMSLAVE que je veux les remplacer par 19920505 et 19971015 respectivement,
      et je veux appliqué ça pour une trentaine de fichier doris1.in qui appartient à des sous répertoires différents
      19930504_19960718, ......ainsi de suite
      CYG
      0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Alors essaie ça :
    find . -type f -name "doris1.in" -exec sed '
    s#NUMMASTER#basename $(dirname {})|cut -d_ -f1#e
    s#NUMSLAVE#basename $(dirname {})|cut -d_ -f2#e
    ' {} \; 
    À taper sur une seule ligne, sinon si tu dois le mettre dans un script :
    find . -type f -name "doris1.in" -exec sed '\
    s#NUMMASTER#basename $(dirname {})|cut -d_ -f1#e\
    s#NUMSLAVE#basename $(dirname {})|cut -d_ -f2#e\
    ' {} \; 
    ;-))
    0
  9. CYG
     
    j ai essayé cette commande, je l ai tapé dans une seule ligne et cygwin me lance
    sed: -e expression #1, char 77: unknown option to 's'
    sed: -e expression #1, char 77: unknown option to 's'
    sed: -e expression #1, char 77: unknown option to 's'
    CYG
    0
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Quelle version de sed ?
    0
  11. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Oups ;-((

    Sur une seule ligne ça doit ressembler à ça (il faut un point virgule entre les 2 expressions de "sed") :
    find . -type f -name "doris1.in" -exec sed 's#NUMMASTER#basename $(dirname {})|cut -d_ -f1#e ; s#NUMSLAVE#basename $(dirname {})|cut -d_ -f2#e' {} \; 
    ;-))
    0
  12. CYG
     
    ben il me donne plein de message, et pour savoir ce qui se passe j ai ajout -i aprés sed pour appliquée la commande sur les fichiers doris, le résultat, il a effacer ttes les lignes qui contiennent NUMMASTER ou NUMSLAVE
    waw
    ;.))
    0
  13. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    ben il me donne plein de message,
    Ben lesquels ???

    et pour savoir ce qui se passe j ai ajout -i aprés sed pour appliquée la commande sur les fichiers doris, le résultat, il a effacer ttes les lignes qui contiennent NUMMASTER ou NUMSLAVE
    C'est bien pour ça que je n'avais pas mis le switch dans mon expression, d'abord vérifier l'affichage sur la sortie standard avant d'appliquer directement ;-\

    Copie/colle la ligne que tu emploies et la sortie occasionnée (coupe un peu si c'est trop long, ou colle le résultat sur cjoint)
    0
  14. CYG
     
    c'est la commande
    find . -type f -name "doris1.in" -exec sed 's#NUMMASTER#basename $(dirname {})|cut -d_ -f1#e ; s#NUMSLAVE#basename $(dirname {})|cut -d_ -f2#e' {} \;

    les messages

    /bin/sh: c: command not found
    /bin/sh: c: command not found
    cut: invalid byte or field list
    try 'cut --help' fore more information.
    /bin/sh:M_IN_NULL: command not found
    cut: invalid byte or field list
    try 'cut --help' fore more information.
    /bin/sh:M_IN_VOL: command not found
    cut: invalid byte or field list
    try 'cut --help' fore more information.
    /bin/sh:M_IN_LEA: command not found
    cut: invalid byte or field list
    try 'cut --help' fore more information.
    /bin/sh:M_IN_LEA: command not found
    cut: invalid byte or field list
    try 'cut --help' fore more information.
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    0
  15. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Bon c'est surement le fait d'être sous Cygwin et pas sous un shell en natif sous GNU/Linux ;-((

    Voilà ce que ça donne chez moi, bon les noms des répertoires ne sont pas les mêmes (mais ça c'est pas grave c'est le résultat qui compte), ainsi que le délimiteur de la commande "cut, adapté pour l'occasion pour partager le nom du répertoire en 2...
    [tmpfs]$ tree     # arborescence
    .
    `-- rep
        |-- sousrep1
        |   `-- doris1.in
        |-- sousrep2
        |   `-- doris1.in
        |-- sousrep3
        |   `-- doris1.in
        |-- sousrep4
        |   `-- doris1.in
        `-- sousrep5
            `-- doris1.in
    
    6 directories, 6 files
    
    [tmpfs]$ cat rep/sousrep1/doris1.in   # contenu fichier "doris1.in"
    bla bla bla
    bli bli bli
    NUMMASTER
    blo blo blo
    NUMSLAVE
    blu blu blu
    
    [tmpfs]$ find . -type f -name "doris1.in" -exec sed '
    s#NUMMASTER#basename $(dirname {})|cut -dr -f1#e
    s#NUMSLAVE#basename $(dirname {})|cut -dr -f2#e
    ' {} \;     # commande
    
    bla bla bla
    bli bli bli
    sous
    blo blo blo
    ep5
    blu blu blu
    
    bla bla bla
    bli bli bli
    sous
    blo blo blo
    ep4
    blu blu blu
    
    bla bla bla
    bli bli bli
    sous
    blo blo blo
    ep3
    blu blu blu
    
    bla bla bla
    bli bli bli
    sous
    blo blo blo
    ep2
    blu blu blu
    
    bla bla bla
    bli bli bli
    sous
    blo blo blo
    ep1
    blu blu blu
    
    [tmpfs]$     
    ;-))
    0
  16. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Tiens je te colle le même test avec des sous-répertoires conforment aux tiens :
    [tmpfs]$ tree
    .
    `-- rep
        |-- 19920501_19971011
        |   `-- doris1.in
        |-- 19920501_19971012
        |   `-- doris1.in
        |-- 19920501_19971013
        |   `-- doris1.in
        |-- 19920501_19971014
        |   `-- doris1.in
        |-- 19920501_19971015
        |   `-- doris1.in
        |-- 19920502_19971011
        |   `-- doris1.in
        |-- 19920502_19971012
        |   `-- doris1.in
        |-- 19920502_19971013
        |   `-- doris1.in
        |-- 19920502_19971014
        |   `-- doris1.in
        |-- 19920502_19971015
        |   `-- doris1.in
        |-- 19920503_19971011
        |   `-- doris1.in
        |-- 19920503_19971012
        |   `-- doris1.in
        |-- 19920503_19971013
        |   `-- doris1.in
        |-- 19920503_19971014
        |   `-- doris1.in
        |-- 19920503_19971015
        |   `-- doris1.in
        |-- 19920504_19971011
        |   `-- doris1.in
        |-- 19920504_19971012
        |   `-- doris1.in
        |-- 19920504_19971013
        |   `-- doris1.in
        |-- 19920504_19971014
        |   `-- doris1.in
        |-- 19920504_19971015
        |   `-- doris1.in
        |-- 19920505_19971011
        |   `-- doris1.in
        |-- 19920505_19971012
        |   `-- doris1.in
        |-- 19920505_19971013
        |   `-- doris1.in
        |-- 19920505_19971014
        |   `-- doris1.in
        `-- 19920505_19971015
            `-- doris1.in
    
    26 directories, 25 files
    
    [tmpfs]$ find . -type f -name "doris1.in" -exec sed '
    s#NUMMASTER#basename $(dirname {})|cut -d_ -f1#e
    s#NUMSLAVE#basename $(dirname {})|cut -d_ -f2#e
    ' {} \;
    bla bla bla
    bli bli bli
    19920505
    blo blo blo
    19971015
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920505
    blo blo blo
    19971014
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920505
    blo blo blo
    19971013
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920505
    blo blo blo
    19971012
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920505
    blo blo blo
    19971011
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920504
    blo blo blo
    19971015
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920504
    blo blo blo
    19971014
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920504
    blo blo blo
    19971013
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920504
    blo blo blo
    19971012
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920504
    blo blo blo
    19971011
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920503
    blo blo blo
    19971015
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920503
    blo blo blo
    19971014
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920503
    blo blo blo
    19971013
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920503
    blo blo blo
    19971012
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920503
    blo blo blo
    19971011
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920502
    blo blo blo
    19971015
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920502
    blo blo blo
    19971014
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920502
    blo blo blo
    19971013
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920502
    blo blo blo
    19971012
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920502
    blo blo blo
    19971011
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920501
    blo blo blo
    19971015
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920501
    blo blo blo
    19971014
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920501
    blo blo blo
    19971013
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920501
    blo blo blo
    19971012
    blu blu blu
    
    bla bla bla
    bli bli bli
    19920501
    blo blo blo
    19971011
    blu blu blu
    
    [tmpfs]$ 
    0
  17. CYG
     
    merci bcp
    le probléme est résolu
    CYG
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      De rien, mais peut-on savoir de quelle façon, s'il te plaît ?

      Merci d'avance ;-)
      0