Forum Programmation.shell Correction formule avec sed

Posté par  .
Étiquettes : aucune
0
1
juin
2005
bonjour,

au sein d'une fonction, j'écris des lignes dans un fichier txt.
Cependant, le fichier a terme doit être traité sur une machine sous dos.
Donc je dois changer les terminaisons de ligne de LF vers CR+LF.

La sortie de ma fonction initialement était : (elle change les § en )
fonction()
{
....
echo "`echo "${Ligne}" | sed -e "s/§/\ /g"`"
}

qui me donne des terminaison de ligne en LF.

Sur le site de sed, j'ai vu dans cette page:
http://sed.sourceforge.net/sed1line.txt(...)
que en shell ksh (celui que j'utilise), je pouvais changer les LF en CR+LF avec:
# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format
sed "s/$/`echo -e \\\r`/" # command line under ksh


Donc, j'ai essayé de changer ma sortie de fonction en:
echo "`echo "${Ligne}" | sed -e "s/§/\ /g" | sed "s/$/`echo -e \\\r`/"`"
mais l'imbrication des substitution de commandes `` pose probleme...
: s/$/: not found
: /: cannot execute


Si quelqu'un peut m'aider, merci beaucoup.

Note: je suis sous SunOS 5.9 en ksh et je ne suis pas interressé par une solution a base de perl... juste du ksh, merci (environnement de dev strict...)
  • # substitution de commande

    Posté par  . Évalué à 4.

    Pas essayé, mais plutot que faire du ` `, essaie $( ). L'avantage: tu peux les imbriquer sans problème.
    • [^] # Re: substitution de commande

      Posté par  . Évalué à 1.

      Effectivement, ca resoud le probleme de l'imbrication. echo "$(echo "${LigneArticleFin}" | sed -e "s/§/\ /g" | sed "s/$/$(echo -e \\\r)/g")" Par contre, les fins des lignes finissent du coup par "-e "... Là, je vois pas...
  • # simplifie

    Posté par  (site web personnel) . Évalué à 4.

    Tu te compliques la vie.
    1/ Ton premier echo est inutile.
    2/ Ton $ligne est une seule ligne, non ?
    Si oui, le /g est inutile. Sinon il faut aussi un /g au 2e sed.
    3/ je suppose que ce qui apparait comme '\ ' est un '\n' que templeet a mangé ?
    Si oui, je n'en vois pas l'intérêt, les commande echo ou sed rajoutent automatiquement un \n à la fin de chaque ligne.

    Donc il suffit de faire :
    echo "${Ligne}" | sed "s/$/`echo -e \\\r`/"
    • [^] # Re: simplifie

      Posté par  . Évalué à 1.

      Bonjour,
      
      1/ tu as parfaitement raison, merci ;')
      
      2/ Oui, une seule ligne, mais j'ai plus "zone" de caractere § à remplacer par des espaces.
      Doù le /g.
      Par contre, pour le 2eme sed, je ne veux changer qu'une fois 
      le caractere de terminaison de la ligne...
      
      3/ le '\ ' n'est pas un '\n', c'est pour remplacer par un espace le §
      
      
      Je viens d'essayer ton code, j'ai toujours le '-e ' qui apparait...
      man echo ne me montre pas d'option -e pour echo sous sunOS... 
      et je ne suis pas sur qu'elle existe sous linux non plus d'ailleurs. 
      Je comprend pas car la formule vient d'une doc de sed...
      
      J'ai essayé aussi ca:
      echo "${Ligne}\c" | sed -e "s/§/\ /g"
      echo \r\n
      
      pour enlever le LN et mettre après un CR+LN, mais sed ne passe 
      plus en me disant qu'il n'y a pas de line feed (forcement, option \c)...
      
      Argh!!!
      • [^] # Re: simplifie

        Posté par  (site web personnel) . Évalué à 3.

        > 2/ Oui, une seule ligne, mais j'ai plus "zone" de caractere § à remplacer par des espaces.
        Doù le /g


        Ok, je n'avais pas compris ça.

        > 3/ le '\ ' n'est pas un '\n', c'est pour remplacer par un espace le §

        Dans ce cas, pas besoin de le backslasher.

        > Je viens d'essayer ton code, j'ai toujours le '-e ' qui apparait...

        Oui c'est normal, le sed que tu as trouvé sur la page web fonctionne pour une certaine version de ksh, sur un certain système. Mais pas chez toi, parce que ta commande echo comprend que le '-e' est quelque chose à afficher.

        Donc essaye :

        echo "${Ligne}" | sed "s/§/ /g" | sed "s/$/`echo \\\r`/"
  • # vous vous compliquer la vie

    Posté par  (site web personnel) . Évalué à 1.

    1) pourquoi utiliser vous des " alors que les ' permettent de protéger les $ et autres caractères

    2) pour taper le code d'un touche dans un shell, on tape ctrl-V puis on tappe la touche. Donc par exemple, ctrl+v +ENTREE donne ^M

    donc ça devrait faire l'affaire
    echo "${Ligne}" | sed -e 's/$/^M/'

    j'ai remplacé le § par $ parce que je vois pas trop ce qu'il vient faire là !

    enfin moi je teste ça sous bash mais ça devrait marché pareil sous ksh ...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.