Sie können verwenden
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
Entfernen der Markierung für die Bytereihenfolge vom Anfang der Datei, falls vorhanden, sowie Konvertieren von CR-LF-Zeilenumbrüchen in LF-Zeilenumbrüche. Das LANG=C LC_ALL=C
teilt der Shell mit, dass der Befehl im Standardgebietsschema C (auch als Standard-POSIX-Gebietsschema bezeichnet) ausgeführt werden soll. Dabei werden die drei Bytes, die die Byte-Ordnungsmarke bilden, als Bytes behandelt. Die -i
Option zu sed bedeutet vor Ort. Wenn Sie verwenden -i.old
, speichert sed die Originaldatei als filename.old
und die neue Datei (mit den Änderungen, falls vorhanden) als filename
.
Ich persönlich habe das gerne als ~/bin/fix-ms
; zum Beispiel als
#!/bin/dash
export LANG=C LC_ALL=C
if [ $# -gt 0 ]; then
for FILE in "$@" ; do
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$FILE" || exit 1
done
else
exec sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//'
fi
Wenn ich dies anwenden muss, um alle C-Quelldateien und -Header (z. B. meinen alten Code aus der MS-DOS-Ära) auszudrücken, führe ich einfach aus
find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
oder, wenn ich nur eine solche Datei anschauen möchte, ohne sie zu ändern, kann ich sie ausführen
~/bin/ms-fix < filename | less
und nicht das hässliche <U+FEFF>
in meinem UTF-8-Terminal sehen.