recode soll alle TeX-Dateien neu encodieren...

21/05/2016 - 19:55 von Michael Hagedorn | Report spam
Hallo.
Ich habe mir ein kleines Bash-Script zusammengestrickt, das
*automatisch* alle LaTeX-Dateien (*.tex) finden soll und danach das
bestehende encoding auf utf-8 àndern soll. Das klappt bisher so halbwegs
... aber noch nicht perfekt.

Hier das Script -- ganz unten die Probleme:

-
#!/bin/bash

#Dieses Script sucht automatisch alle .tex/.sty-Files in einem Ordner
#und prüft das Encoding. Anschließend wird alles auf utf8 encodiert.
#Zusàtzlich wird der Befehl
#\usepackage[<alter Wert>]{inputenc} auf
#\usepackage[utf8]{inputenc}
#umgestellt.

#Test, ob Syntax richtig angegeben wurde:
filename="${0##*/}"
scriptpath=`pwd -P`

if [ -z "$1" ]
then
echo
echo "Syntax: $scriptpath/$filename <encoding bzw. utf8>"
echo
exit 0;
fi

for files in $(find ./ -name '*.tex' -or -name '*.sty'); do

# Finde aktuelles encoding der Datei heraus:
# entweder so:
encoding=$(file -i "$files" | sed "s/.*charset=\(.*\)$/\1/")

# oder so -- funktioniert aber nicht richtig!
#encoding=$(grep -iERl "(cm850|latin1)" .)

if [ ! "$1" == "${encoding}" ]
then
# Encodings sind unterschiedlich, recode wird benötigt:
echo "recoding von ${encoding} nach $1 Dateiname: $files"
recode ${encoding}..$1 $files
fi

# inputenc überall auf UTF-8 setzen -- schöner mit Variablen?!
sed -i "s/usepackage\[latin1\]/usepackage\[$1\]/g" $files
sed -i "s/usepackage\[cm850\]/usepackage\[$1\]/g" $files

done

# Problem : file -i wirft andere Bezeichnungen raus, als LaTeX
# (z.B. utf-8 und utf8 oder latin1 und iso-8859-1)


Muss ich dabei noch etwas anderes bedenken oder reicht diese Überprüfung?

Michael
 

Lesen sie die antworten

#1 Martin Vaeth
22/05/2016 - 11:22 | Warnen spam
Michael Hagedorn wrote:

for files in $(find ./ -name '*.tex' -or -name '*.sty'); do


[...]
done



Besser (kommt mit allen Filenamen zurecht):

find ./ '-(' -name '*.tex' -o -name '*.sty' '-)' -exec \
sh -c 'for files
do
[...]
done' sh '{}' '+'

encoding=$(file -i "$files" | sed "s/.*charset=\(.*\)$/\1/")

# Problem : file -i wirft andere Bezeichnungen raus, als LaTeX
# (z.B. utf-8 und utf8 oder latin1 und iso-8859-1)



Du wirst wohl hàndisch eine Liste der Bezeichnungen
erstellen müssen, etwa so:

case $encoding in
utf-8)
encoding=utf8;;
iso-8859-1)
encoding=latin1;;
...
esac

Ähnliche fragen