So finden Sie ein Windows End of Line (EOL) -Scharakter
Frage
Ich habe mehrere hundert GB Daten, die ich mit dem UNIX -Paste -Dienstprogramm in Cygwin zusammenfügen muss, aber es funktioniert nicht ordnungsgemäß, wenn in den Dateien Windows -EOL -Zeichen enthalten sind. Die Daten haben möglicherweise Windows -EOL -Zeichen, und ich möchte nicht die Zeit damit verbringen, dos2unix zu laufen, wenn ich nicht muss.
Meine Frage ist also, wie ich in Cygwin herausfinden kann, ob diese Dateien Windows EOL -CRLF -Zeichen haben?
Ich habe versucht, einige Testdaten zu erstellen und zu laufen
sed -r 's/\r\n//' testdata.txt
Dies scheint jedoch übereinstimmen, unabhängig davon, ob dos2unix ausgeführt wurde oder nicht.
Vielen Dank.
Lösung
Das file(1)
Dienstprogramm kennt den Unterschied:
$ file * | grep ASCII
2: ASCII text
3: ASCII English text
a: ASCII C program text
blah: ASCII Java program text
foo.js: ASCII C++ program text
openssh_5.5p1-4ubuntu5.dsc: ASCII text, with very long lines
windows: ASCII text, with CRLF line terminators
file(1)
wurde optimiert, um zu versuchen, so wenig wie möglich von einer Datei zu lesen, sodass Sie Glück haben und die Menge an Festplatten -IO, die Sie durchführen müssen, bei der Suche und Behebung der CRLF -Terminatoren drastisch reduzieren.
Beachten Sie, dass einige Fälle von CRLF an Ort und Stelle bleiben sollten: Erfassungen von SMTP wird CRLF verwenden. Aber das liegt an dir. :)
Andere Tipps
Sie können die Verwendung herausfinden file
:
file /mnt/c/BOOT.INI
/mnt/c/BOOT.INI: ASCII text, with CRLF line terminators
CRLF ist hier der wesentliche Wert.
Wenn Sie erwarten, dass sich der Exit -Code anders unterscheidet von sed
, es wird nicht sein. Es wird eine Substitution durchführen oder nicht von der Übereinstimmung. Der Exit -Code ist wahr, es sei denn, es gibt einen Fehler.
Sie können einen nutzbaren Exit -Code von erhalten grep
, jedoch.
#!/bin/bash
for f in *
do
if head -n 10 "$f" | grep -qs $'\r'
then
dos2unix "$f"
fi
done
#!/bin/bash
for i in $(find . -type f); do
if file $i | grep CRLF ; then
echo $i
file $i
#dos2unix "$i"
fi
done
KONTIMENT "#DOS2UNIX" $ I "" Wenn Sie bereit sind, sie zu konvertieren.
Vielen Dank, dass der Befehl "Datei 1) verwendet wird, aber es braucht etwas mehr Verfeinerung. Ich hatte die Situation, in der nicht nur einfache Textdateien, sondern auch einige ".sh" -Skripte die falsche EOL hatten. Und "Datei" meldet sie wie folgt, unabhängig von EOL:
xxx/y/z.sh: application/x-shellscript
Die Option "Datei -e Soft" wurde also (zumindest für Linux) benötigt:
bash$ find xxx -exec file -e soft {} \; | grep CRLF
Dies findet alle Dateien mit DOS EOL in Verzeichnis xxx und Unterverdienungen.
GREP rekursiv, mit Dateimusterfilter
grep -Pnr --include=*file.sh '\r$' .
Ausgabedatei Name, Zeilennummer und Zeile selbst
./test/file.sh:2:here is windows line break
Wie oben angegeben, funktioniert die Lösung "Datei". Vielleicht kann das folgende Code -Snippet helfen.
#!/bin/ksh
EOL_UNKNOWN="Unknown" # Unknown EOL
EOL_MAC="Mac" # File EOL Classic Apple Mac (CR)
EOL_UNIX="Unix" # File EOL UNIX (LF)
EOL_WINDOWS="Windows" # File EOL Windows (CRLF)
SVN_PROPFILE="name-of-file" # Filename to check.
...
# Finds the EOL used in the requested File
# $1 Name of the file (requested filename)
# $r EOL_FILE set to enumerated EOL-values.
getEolFile() {
EOL_FILE=$EOL_UNKNOWN
# Check for EOL-windows
EOL_CHECK=`file $1 | grep "ASCII text, with CRLF line terminators"`
if [[ -n $EOL_CHECK ]] ; then
EOL_FILE=$EOL_WINDOWS
return
fi
# Check for Classic Mac EOL
EOL_CHECK=`file $1 | grep "ASCII text, with CR line terminators"`
if [[ -n $EOL_CHECK ]] ; then
EOL_FILE=$EOL_MAC
return
fi
# Check for Classic Mac EOL
EOL_CHECK=`file $1 | grep "ASCII text"`
if [[ -n $EOL_CHECK ]] ; then
EOL_FILE=$EOL_UNIX
return
fi
return
} # getFileEOL
...
# Using this snippet
getEolFile $SVN_PROPFILE
echo "Found EOL: $EOL_FILE"
exit -1
Sie können die Option von DOS2Unix verwenden, um Informationen zu DOS UNIX MAC -Zeilenumbrüchen (in dieser Reihenfolge), BOMs und Text/Binary zu erhalten, ohne die Datei zu konvertieren.
$ dos2unix -i *.txt
6 0 0 no_bom text dos.txt
0 6 0 no_bom text unix.txt
0 0 6 no_bom text mac.txt
6 6 6 no_bom text mixed.txt
50 0 0 UTF-16LE text utf16le.txt
0 50 0 no_bom text utf8unix.txt
50 0 0 UTF-8 text utf8dos.txt
Mit dem "C" -FLAG DOS2Unix meldet Dateien, die konvertiert werden, die IOW -Dateien haben DOS -Zeilenunterbrechungen. Um alle TXT -Dateien mit DOS -Zeilenpausen zu melden, können Sie dies tun:
$ dos2unix -ic *.txt
dos.txt
mixed.txt
utf16le.txt
utf8dos.txt
Um nur diese Dateien zu konvertieren, die Sie einfach durchführen:
dos2unix -ic *.txt | xargs dos2unix
Wenn Sie über Verzeichnisse rekursiv gehen müssen, die Sie tun:
find -name '*.txt' | xargs dos2unix -ic | xargs dos2unix
Siehe auch die Mannseite von dos2unix.