Insertion d'un retour chariot dans une chaine

thufenn -  
jipicy Messages postés 41342 Statut Modérateur -
Bonjour,

Je suis en train de travailler sur un shell qui prend un fichier et le remet en forme.
L'idée de fond c'est de mettre le fichier dans une variable
de faire une suite de traitement sur cette variable et pour finir
de faire un echo de ma variable pour voir le resultat ou le mettre dans un fichier

les traitement utilisés sont des sed,grep,tr et sort

Le temps premiers traitement est de tout mettre sur une seul ligne grace à un tr -s '\r\n' ' '

puis ensuite grace à des sed j'insère les retour chariot au bon endroit
et la il y a qqchose qui cloche!!!

Pour mieux comprendre ,voici un exemple de code , l'idée est relativement simpliste puisqu'elle consiste a mettre des sauts de lignes avant le mot ligne

01: #!/bin/sh
02: texte=ligne1ligne2ligne3
03: 
04: echo "-------"
05: echo $texte
06: 
07: echo "-------"
08: echo $texte | sed s/'ligne'/'\r\nligne'/g
09: 
10: echo "-------"
11: texte=$(echo $texte | sed s/'ligne'/'\r\nligne'/g)
12: echo $texte


resultat (avec vi) :
-------
ligne1ligne2ligne3
-------
^M
ligne1^M
ligne2^M
ligne3
-------
^M ligne1^M ligne2^M ligne3




Ce que je ne comprends pas dans cette execution c'est pourquoi à la ligne 08 j'obtiens bien des lignes distinctes pour chaque mot ligne
alors qu'avec les lignes 11 et 12 tout se trouve sur la même ligne se qui me privent de l'utilisation des grep.

A première vue le problème ne vient pas du sed puisqu'il se fait comme il faut en ligne 08, mais plutôt du passage par la variable texte

Si quelqu'un à une idée......

NB : j'ai déjà essayé :
. de remplacer le '\r\n' par '\n\r' , '\r' et '\n'
. de mettre echo -e
. et de remplcer $(.....) par des côtes inversées
A voir également:

1 réponse

jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

Il faut changer la valeur de la variable "IFS" (Input Field Separator) avant la commande "echo" :
10: echo "-------"
11: texte=$(echo $texte | sed s/'ligne'/'\r\nligne'/g)
12: OLD_IFS=$IFS
13: IFS=" "
14: echo $texte
15: IFS=$OLD_IFS
Un bon moyen pour te rendre compte, rajoute la ligne :
set -xv
en début de script pour déboguer ton script et voir comment les variables sont interprétées ;-))
4