IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

sed commande w write [SH]


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Par défaut sed commande w write
    Bonjour,

    J’exécute un script sed contenant 2 commandes w write

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/bin/sh
    echo "tata
    titi
    tutu" >test.txt
     
    echo -n "#!/system/bin/sed -n -r -f
    1 {
    x
    s/^$/toto/
    w test2.txt
    x
    }
    tx
    :x
    s/i/y/g
    t lbp
    w test2.txt
    d
    :lbp
    p
    " >test.sed
     
    sed -n -r -f test.sed test.txt >result.txt
    La 1ere commande w ne semble pas prise en compte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    sh>sh ./test.sh
    sh>cat test.txt
    tata
    titi
    tutu
    sh>
    sh>cat result.txt
    tyty
    sh>
    sh>cat test2.txt
    tata
    tutu
    En commentant la 2eme je constate qu'elle est écrasée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    t lbp
    #w test2.txt
    d
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sh>sh ./test.sh
    sh>cat test.txt
    tata
    titi
    tutu
    sh>cat result.txt
    tyty
    sh>cat test2.txt
    toto
    Pourquoi ?

    Merci d'avance pour vos réponses

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Intéressant. je n'ai pas la même sortie que toi avec GNU sed 4.4.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ test.sed test.txt
    tyty
    $ cat test2.txt
    toto
    tata
    tutu
    Et ce résultat est celui attendu, quand on fait tourner le programme "à la main".


    Parenthèse : spécifier le shebang est utile pour rendre le fichier exécutable seul.
    • ./test.sh au lieu de sh ./test.sh.
    • ./test.sed test.txt au lieu de sed -n -r -f ./test.sed test.txt.
      D'ailleurs, je regrouperais les options dans le shebang : #!/system/bin/sed -nrf.



    Maintenant, pourquoi expérimentes-tu ce désagrément ?
    Le problème est qu'en désactivant toutes les extensions GNU par la commande sed --posix, je n'obtiens pas plus ton résultat d'écrasement.
    Quel version de sed as-tu ?


    [edit] Non. J'ai trouvé. Il y a une espace à la fin de la première ligne "w". Ce qui fait qu'il n'écrit pas dans le fichier "test2.txt" mais "test2.txt ". Et tu dois avoir 2 fichiers différents dans ton dossier. [/edit]

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Par défaut
    Merci pour cette réponse rapide.
    De retour online, il fait vraiment trop chaud dehors.
    Je suis un nouveau, un peu galérè pour me reconnecter sur mon compte.

    J'exécute ce script sur android 7.1.2.
    Donc pas de awk et perl en natif.

    Concernant l'exécution directe, je peux pas à cause des droits sur sdcard.
    Le shebang est plutôt par effort normalisation.

    Ok pour les options groupées -nrf. En plus ça fait littéraire. Ça me va.

    Concernant la version de sed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sh>sed --version
    This is not GNU sed version 9.0
    Je ne vois pas l'espace en fin de write
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    sh>sed 's/.*/&|/' test.sed
    #!/system/bin/sed -nrf|
    1 {|
    x|
    s/^$/toto/|
    w test2.txt|
    x|
    }|
    tx|
    :x|
    s/i/y/g|
    t lbp|
    w test2.txt|
    d|
    :lbp|
    p|
    et je n'ai pas les 2 fichiers dans la directory

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sh>ls -l test*
    -rw-rw---- 1 root sdcard_rw  97 2019-07-06 16:24 test.sed
    -rw-rw---- 1 root sdcard_rw 204 2019-07-06 16:24 test.sh
    -rw-rw---- 1 root sdcard_rw  15 2019-07-06 16:24 test.txt
    -rw-rw---- 1 root sdcard_rw  10 2019-07-06 16:24 test2.txt
    sh>
    Comment le constates-tu ?

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Que donne ls -l *test* dans ton dossier ?

    Quel est le résultat si tu mets un troisième w test2.txt en première ligne du code ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Par défaut
    Bonjour,

    Pour le ls
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sh>ls -l *test*
    -rw-rw---- 1 root sdcard_rw  97 2019-07-06 16:24 test.sed
    -rw-rw---- 1 root sdcard_rw 204 2019-07-06 16:24 test.sh
    -rw-rw---- 1 root sdcard_rw  15 2019-07-06 16:24 test.txt
    -rw-rw---- 1 root sdcard_rw 171 2019-07-08 05:29 test2.txt
    Pour la modif du script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/bin/sh
    echo "tata
    titi
    tutu" >test.txt
     
    echo -n "#!/system/bin/sed -nrf
    w test2.txt
    1 {
    x
    s/^$/toto/
    w test2.txt
    x
    }
    tx
    :x
    s/i/y/g
    t lbp
    w test2.txt
    d
    :lbp
    p
    " >test.sed
     
    sed -n -r -f test.sed test.txt >result.txt
    A l’exécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    sh>sh ./test.sh
    sh>ls -l *test*
    -rw-rw---- 1 root sdcard_rw 109 2019-07-09 05:51 test.sed
    -rw-rw---- 1 root sdcard_rw 216 2019-07-09 05:51 test.sh
    -rw-rw---- 1 root sdcard_rw  15 2019-07-09 05:51 test.txt
    -rw-rw---- 1 root sdcard_rw  15 2019-07-09 05:51 test2.txt
    sh>cat test.sed
    #!/system/bin/sed -nrf
    w test2.txt
    1 {
    x
    s/^$/toto/
    w test2.txt
    x
    }
    tx
    :x
    s/i/y/g
    t lbp
    w test2.txt
    d
    :lbp
    p
    sh>cat result.txt
    tyty
    sh>cat test2.txt
    tata
    tutu
    tutu
    sh>

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Quel casse-tête !
    Si titi est écrasé, tata doit l'être aussi. Et si tata n'est pas écrasé, titi non plus. Or titi est absent et tata présent.
    Quand à tutu, rien n'est écrasé.

    La réponse avec GNU Linux Debian avec bash 4.4 et GNU sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tata
    toto
    tata
    titi
    tutu
    tutu
    Que donne la commande suivante ?
    Car si un de tes outils a la mauvaise idée de faire des fins de ligne en \r (ou \r\n), alors ce qui est écrasé n'est pas le fichier. Mais la ligne.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Par défaut Mais ou est passé toto ?
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sh>od -c test.sed
    0000000   #   !   /   s   y   s   t   e   m   /   b   i   n   /   s   e
    0000020   d       -   n   r   f  \n   w       t   e   s   t   2   .   t
    0000040   x   t  \n   1       {  \n   x  \n   s   /   ^   $   /   t   o
    0000060   t   o   /  \n   w       t   e   s   t   2   .   t   x   t  \n
    0000100   x  \n   }  \n   t   x  \n   :   x  \n   s   /   i   /   y   /
    0000120   g  \n   t       l   b   p  \n   w       t   e   s   t   2   .
    0000140   t   x   t  \n   d  \n   :   l   b   p  \n   p  \n
    0000155
    sh>od -c test.txt
    0000000   t   a   t   a  \n   t   i   t   i  \n   t   u   t   u  \n
    0000017
    sh>
    Bug sur la version sed ? Je ne trouve pas de référence sur ce sujet.
    J'utilise "adb shell" pour me connecter en shell sur android depuis un PC.
    J'ai installé un outil shell sur le portable, idem.

    Plus de "toto", suit version plus lisible.
    La mise en commentaire du 2ème "w test2.txt" permet de choisir entre l’entête et les lignes dans le fichier de sortie test2.txt
    C'est l'un ou l'autre mais pas les 2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/bin/sh
    echo "ligne1
    ligne2
    ligne3
    ligne4" >test.txt
    echo "\ntest.txt"
    cat -v test.txt
    echo -n "#!/system/bin/sed -nrf
    1 {
    x
    s/.*/entete/
    w test2.txt
    x
    }
    t traz
    :traz
    s/2/2x/p
    t
    w test2.txt
    " >test.sed
    echo "\ntest.sed"
    cat -v test.sed
    echo "\nsed -nrf test.sed test.txt >result.txt"
    sed -nrf test.sed test.txt >result.txt
    echo "\nresult.txt"
    cat -v result.txt
    echo "\ntext2.txt"
    cat -v test2.txt
    Ce que j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    sh>sh ./test.sh
     
    test.txt
    ligne1
    ligne2
    ligne3
    ligne4
     
    test.sed
    #!/system/bin/sed -nrf
    1 {
    x
    s/.*/entete/
    w test2.txt
    x
    }
    t traz
    :traz
    s/2/2x/p
    t
    w test2.txt
     
    sed -nrf test.sed test.txt >result.txt
     
    result.txt
    ligne2x
     
    text2.txt
    ligne1
    ligne3
    ligne4
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    sh>sh ./test.sh
     
    test.txt
    ligne1
    ligne2
    ligne3
    ligne4
     
    test.sed
    #!/system/bin/sed -nrf
    1 {
    x
    s/.*/entete/
    w test2.txt
    x
    }
    t traz
    :traz
    s/2/2x/p
    t
    #w test2.txt
     
    sed -nrf test.sed test.txt >result.txt
     
    result.txt
    ligne2x
     
    text2.txt
    entete
    sh>

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    J'utilise "adb shell" pour me connecter en shell sur android
    Ahhhh. Ben, cherche pas. C'est ça.
    La fonction sed dans la version toybox ne fonctionne pas correctement.
    Et c'est de notoriété publique.
    Essaie de mettre à jour toybox, avant toute chose.

    Ou trouve une alternative.
    Tu peux par exemple écrire un script mksh (MirBSD KSH) qui doit être ton interpréteur de commande par défaut.

    Apparté: d'ailleurs, pourquoi utiliser sh ? sh est archaïque. Les programmeurs désignent par sh un interpréteur de script, mais ils utilisent souvent une version plus moderne que celle qu'ils prétendent utiliser. (bash, dash, csh, ksh, mksh, etc...)

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    mais pourquoi faire écrire un script sed puis exécuter le script sed, au lieu de simplement exécuter sed dans le script sh ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Par défaut
    Bonjour,

    Merci pour les pistes, je ne voyais pas ou chercher.
    MAJ toybox, mksh.
    Je dois faire tourner sur un android banalisé en mini android 7.

    Concernent le script sed, l'exemple est plus simple que celui d'origine.
    C'est pour moi plus facile de séparer l’interprétation du shell et celle de sed pour les caractères spéciaux.
    Je pourrais après vérification du fonctionnement supprimer le fichier temporaire
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # sauts de lignes protégés par des " -> caractère non imprimable 1E RS
    /^(((([^'$sep'"]*)|("(("")|[^'$sep'"])*"))'$sep')*)"((("")|[^'$sep'"])*)$/ { N ; s/\\n/'$RS'/ ; b sep }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sed command pour des pathname ?
    Par fidififouille dans le forum Linux
    Réponses: 10
    Dernier message: 23/12/2010, 12h28
  2. comment modifier le texte dans une commande document.write
    Par riquet90 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/03/2010, 08h48
  3. Commande write ou équivalente
    Par manuaccess10 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 19/05/2006, 12h12
  4. La commande sed
    Par ajsd0208 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 26/04/2006, 14h34
  5. Commande SED
    Par pierregag dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 17/03/2006, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo