Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/06/2017, à 09:34

Tangram

[Script/sh] changer les retours de ligne Macintosh/Windows/Unix

(suite de https://forum.ubuntu-fr.org/viewtopic.php?id=2010287)

J'ai écrit, avec l'aide de Postmortem, trois petits scripts SH qui permettent de changer indifféremment les retours de ligne de mes sources entre Macintosh (les vieux), MS-DOS/Windows et Unix, quelque soit le fichier de départ. Ces programmes fonctionnent très bien sur Ubuntu. Ceci dit, j'émettrai des réserves quant à leur efficacité sur les autres systèmes d'exploitation. La ligne du 'sed' dans todos.sh me chagrine un peu, il se peut que le signe de fin de ligne '$' soit interprété différemment d'un OS à l'autre. Donc, si ça intéresse quelqu'un, faites des tests préalables, que je ne sois pas responsable d'un irréparable chamboulement de vos fichiers texte.

todos.sh:

#!/bin/sh
#
# todos.sh :
# Convert files from  Windows/MS-DOS, Unix (LF) or Macintosh (CR) to Windows/MS-DOS (CRLF)
# Written by Tangram
# with the help of Postmortem from https://forum.ubuntu-fr.org/

find . -type f '(' \
   -name '*.c' -o \
   -name '*.h' -o \
   -name 'makefile.*' -o \
   -name '*.txt' -o \
   -name '*.bat' -o \
   -name '*.BAT'\
   ')' \
   -exec sh -c 'printf '\'\\r%s%15s\\r\'' {} '\'\'';
                grep -q $(printf '\'\\r\'') {};
                if [ $? -eq 0 ];
                then
                    mv {} _tmpfile;
                    tr -d '\'\\n\'' < _tmpfile > _tmpfile2;
                    tr '\'\\r\'' '\'\\n\'' < _tmpfile2 > {};
                    touch -r _tmpfile {};
                    rm _tmpfile2;
                    rm _tmpfile;
                fi;
                mv {} _tmpfile;
                sed '\'s/\$/\\r/\'' _tmpfile > {};
                touch -r _tmpfile {};
                rm _tmpfile' \;
echo

tomac.sh :

#!/bin/sh
#
# tomac.sh :
# Convert files from Macintosh, Unix (LF) or Windows/MS-DOS (CRLF) to Macintosh (CR)
# Written by Tangram
# with the help of Postmortem from https://forum.ubuntu-fr.org/

find . -type f '(' \
   -name '*.c' -o \
   -name '*.h' -o \
   -name 'makefile.*' -o \
   -name '*.txt' -o \
   -name '*.bat' -o \
   -name '*.BAT' \
   ')' \
   -exec sh -c 'mv {} _tmpfile;
                printf '\'\\r%s%15s\\r\'' {} '\'\'';
                grep -q $(printf '\'\\r\'') _tmpfile;
                if [ $? -eq 0 ];
                then
                    tr -d '\'\\n\'' < _tmpfile > {};
                else
                    tr '\'\\n\'' '\'\\r\'' < _tmpfile > {};
                fi;
                touch -r _tmpfile {};
                rm _tmpfile' \;
echo

tounix.sh :

#!/bin/sh
#
# tounix.sh :
# Convert files from Unix, Windows/MS-DOS (CRLF) or Macintosh (CR) to Unix (LF)
# Written by Tangram
# with the help of Postmortem from https://forum.ubuntu-fr.org/

find . -type f '(' \
   -name '*.c' -o \
   -name '*.h' -o \
   -name 'makefile.*' -o \
   -name '*.txt' -o \
   -name '*.bat' -o \
   -name '*.BAT' \
   ')' \
   -exec sh -c 'printf '\'\\r%s%15s\\r\'' {} '\'\'';
                grep -q $(printf '\'\\r\'') {};
                if [ $? -eq 0 ];
                then
                    mv {} _tmpfile;
                    tr -d '\'\\n\'' < _tmpfile > _tmpfile2;
                    tr '\'\\r\'' '\'\\n\'' < _tmpfile2 > {};
                    touch -r _tmpfile {};
                    rm _tmpfile2;
                    rm _tmpfile;
                fi' \;
echo

Dernière modification par Tangram (Le 03/06/2017, à 12:33)

#2 Le 22/06/2017, à 08:49

DonutMan75

Re : [Script/sh] changer les retours de ligne Macintosh/Windows/Unix

Hello,
merci pour ces scripts !
Je me suis retrouvé exactement dans ce cas là il n'y a pas longtemps, je devais lire des données écrite sous Windows depuis mon Ubuntu ^^

Une possible amélioration serait d'enlever le find et de traiter les fichiers passés en arguments ?
Par ailleurs, je n'ai pas compris à quoi sert la ligne (dans todos.sh) :

'printf '\'\\r%s%15s\\r\'' {} '\'\'';

Ca affiche genre le nom du fichier en cours de traitement ?
Le grep qui suit, je suppose que c'est juste pour vérifier qu'il y a bien des choses à traiter dans le fichier donné ?

Par ailleurs pourquoi jongler avec deux tmpfile ?

Est-ce que

mv {} _tmpfile;
tr -d '\'\\n\'' < _tmpfile > _tmpfile2;
tr '\'\\r\'' '\'\\n\'' < _tmpfile2 > {};

n'aurait pas pu s'écrire directement :

tr -d '\'\\n\'' < {} > _tmpfile;
tr '\'\\r\'' '\'\\n\'' < _tmpfile > {};

et à quoi sert le touch -r en fin de script ?

Merci en tout cas pour ce code smile

Bonne journée à tous,

Donut

Dernière modification par DonutMan75 (Le 22/06/2017, à 08:51)

Hors ligne