#1 Le 03/06/2017, à 08: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, à 11:33)
#2 Le 22/06/2017, à 07: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
Bonne journée à tous,
Donut
Dernière modification par DonutMan75 (Le 22/06/2017, à 07:51)
Hors ligne