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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top