Rechercher : dans
Par :

Insertion d'un retour chariot dans une chaine

Dernière réponse le 20 aoû 2007 à 16:39:25 thufenn, le 20 aoû 2007 à 15:54:54 
 Signaler ce message aux modérateurs

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
Configuration: Windows XP
Firefox 2.0.0.6

Meilleures réponses pour « Insertion d'un retour chariot dans une chaine » dans :
Sed - Conversion retours chariots DOS (CRLF) / UNIX (LF) VoirConversion format de fichier DOS UNIX / UNIX DOS Préambule Ce qu'il faut savoir Conversion DOS vers UNIX Conversion UNIX vers DOS Préambule Il existe déjà des utilitaires (dos2unix et unix2dos) qui s'acquittent très bien ce...
Sed - Insérer des espacements VoirEspacement dans un fichier * Ajouter une ligne blanche après chaque phrase (ponctuée par un retour chariot) : sed G fichier.txt Ajouter une ligne blanche après chaque phrase (ponctuée par un retour chariot), sans tenir compte des lignes...
Télécharger Ant Renamer VoirANT Renamer permet de renommer un grand nombre de fichiers et dossiers en quelques clics. Il ne fait que modifier les noms des fichiers/dossiers : Changement d'extension Remplacement de chaînes de caractères par d'autres Insertion d'une chaîne...
VBScript - Les constantes VoirQu'est-ce qu'une constante ? Une constante est un nom, facilement mémorisable, remplaçant une valeur (nombre, chaîne, etc.) qui ne change pas. L'objectif d'une constante est d'une part de permettre de rendre un programme plus lisible, d'autre part...
PHP - Les variables VoirConcept de variable avec PHP Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage PHP peuvent être de trois...
Paragraphes en HTML VoirParagraphes Le langage HTML considère les paragraphes comme des blocs de texte. Les navigateurs répartissent au mieux leur contenu dans la fenêtre à moins qu'=un attribut NOWRAP ou NOBR soit spécifié explicitement. A l'intérieur d'un paragraphe,...

1

 jipicy, le 20 aoû 2007 à 16:39:25
  • +2

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 ;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy