Sed et awk provoquant un retour à la ligne

J’ai un fichier du formulaire:

FA01_01:The birch canoe slid on the smooth planks FA01_02:Glue the sheet to the dark blue background 

J’en ai besoin pour être de la forme (notez également l’utilisation de minuscules):

  the birch canoe slid on the smooth planks  (FA01_01)  glue the sheet to the dark blue background  (FA01_02) 

J’ai donc essayé l’expression suivante avec sed:

 sed 's/\(.......\):\(.*$\)/(\1)  \2 /' tmp.dat 

mais c’est ce qu’il a retourné:

  (FA01_01)anoe slid on the smooth planks  (FA01_02)eet to the dark blue background 

Pour quelque raison que ce soit, il semble que sed entraîne le motif remplacé au début de la ligne, mais uniquement pour la seconde. Exemple:

 $> sed 's/\(.......\):\(.*$\)/\1 \2/' tmp.dat FA01_01 The birch canoe slid on the smooth planks 

Est correct, mais

 $>sed 's/\(.......\):\(.*$\)/\2 \1/' tmp.dat FA01_01h canoe slid on the smooth planks 

Cela se produit même avec awk aussi. Pour tester l’hypothèse du wraparound:

 $> awk 'BEGIN{FS=":"}{print tolower($2) "XXX"}' tmp.dat XXX birch canoe slid on the smooth planks 

mais

 $> awk 'BEGIN{FS=":"}{print tolower($1) "XXX"}' tmp.dat fa01_01XXX 

Avez-vous des idées sur ce qui causerait ce retour à la ligne? Cela a-t-il quelque chose à voir avec le fait que le deuxième motif ou la colonne enregistrée va jusqu’à la fin de la ligne?

La raison en est que votre tmp.dat est probablement au format DOS (avec des caractères \ r). Vous pouvez essayer de le convertir au format Linux (avec seulement \ n), par exemple avec la commande:

 dos2unix tmp.dat 

Et puis exécuter:

 sed 's/\(.......\):\(.*$\)/\L \2 \E<\/s> (\1)/' tmp.dat