Ich muss regelmäßig einen Befehl ausführen, der sicherstellt, dass einige Textdateien im Linux-Modus gespeichert werden. Leider dos2unix
ändert sich die Datei immer, was die Zeitstempel von Dateien und Ordnern durcheinander bringt und unnötige Schreibvorgänge verursacht.
Das Skript, das ich schreibe, ist in Bash, daher bevorzuge ich Antworten, die auf Bash basieren.
bash
text-processing
newlines
Adam Ryczkowski
quelle
quelle
test
durchmyfile.txt
zweimal ersetzen , um Verwechslungen zu vermeiden/usr/bin/test
.-s
Flag löschen , um die Ausgabe zu sehen. Aus Manpages:-s, --quiet, --silent suppress all normal output
Wenn das Ziel nur darin besteht, den Zeitstempel nicht zu beeinflussen,
dos2unix
haben Sie eine-k
oder--keepdate
-Option, mit der der Zeitstempel gleich bleibt. Es muss immer noch geschrieben werden, um die temporäre Datei zu erstellen und umzubenennen, aber Ihre Zeitstempel bleiben davon unberührt.Wenn eine Änderung der Datei nicht akzeptabel ist, können Sie die folgende Lösung aus dieser Antwort verwenden .
quelle
find ... -exec file ... | grep CRLF
für eine Datei mit DOS-Zeilenenden (dh Bytes 0D 0A) " Folgendes angezeigt wird:./1/dos1.txt: ASCII text, with CRLF line terminators
Wie Sie sehen, enthält diese die tatsächliche Zeichenfolge CRLF und wird daher durchgrep
Suchen abgeglichen die einfache Zeichenfolge CRLF.Sie könnten versuchen,
grep
für CRLF-Code, oktal:oder hex:
quelle
grep
Verwendung, weil es mir ermöglicht, alle diese Dateien im Verzeichnis mitgrep -lU $'\x0D' *
aufzulisten und die Ausgabe an zu übergebenxargs
.Seit Version
7.1
dos2unix eine hat-i
,--info
auf Option , um Informationen über Zeilenumbrüche zu erhalten. Sie können dos2unix selbst verwenden, um zu testen, welche Dateien konvertiert werden müssen.Beispiel:
quelle
Erste Methode (
grep
):Zählen Sie die Zeilen, die einen Wagenrücklauf enthalten:
Zählen Sie die Zeilen, die mit einem Wagenrücklauf enden :
Diese sind normalerweise gleichwertig. Ein Wagenrücklauf im Inneren einer Zeile (dh nicht am Ende) ist selten.
Effizienter:
Das ist effizienter
grep -c
muss die gesamte Datei gelesen werden, um alle Vorkommen des Musters zu zählen, währendgrep -q
beim ersten Auftreten des Musters beendet werden kann.Anmerkungen:
-U
Option hinzufügen (dh-cU
oder verwenden-qU
), da GNUgrep
errät, ob es sich bei der Datei um eine Textdatei handelt. Wenn es sich bei der Datei um Text handelt, werden Zeilenumbrüche an den Zeilenenden ignoriert, um sicherzustellen, dass$
reguläre Ausdrücke "korrekt" funktionieren - auch wenn es sich um reguläre Ausdrücke handelt\r$
! Das Angeben-U
(oder--binary
) überschreibt diese Vermutung, wodurchgrep
die Datei (en) als binär behandelt und die Daten wörtlich mit intakten CR-Endungen an den Abgleichsmechanismus übergeben werden.grep … $'\r\n' myfile.txt
, da dies als Musterbegrenzergrep
behandelt wird\n
. Sucht genauso wiegrep -E 'foo|'
nach Zeilen, diefoo
eine Nullzeichenfolge enthalten,grep $'\r\n'
nach Zeilen, die\r
eine Nullzeichenfolge enthalten, und jede Zeile entspricht einer Nullzeichenfolge.Zweite Methode (
file
):weil
file
berichtet so etwas wie:Sicherere Variante:
wo
file -b
gibt nur den Dateityp und nicht den Dateinamen aus. Ohne diese würde eine Datei, deren Name die Zeichen enthältCRLF
, ein falsches Positiv auslösen.file - < filename
funktioniert auch wennfilename
anfängt mit-
. Siehe Bash-Skript: Überprüfen Sie, ob es sich bei einer Datei um eine Textdatei handelt .Beachten Sie, dass die Überprüfung der Ausgabe
file
in einem nicht englischen Gebietsschema möglicherweise nicht funktioniert.quelle
"$(echo -e '\r')"
das viel einfachere ersetzen$'\r'
, obwohl ich persönlich$'\r\n'
die Anzahl der Fehlalarme verringern würde .grep $'\r\n'
scheint alle Dateien auf meinem System zu entsprechen ...grep -U $'\r$'
, zu verhindern, dass mangrep
versucht, Zeilenenden zu erraten.-q
um nur den Rückkehrcode festzulegen, wenn eine Übereinstimmung gefunden wird, anstatt-c
dass eine zusätzliche Prüfung erforderlich ist. Persönlich mag ich Ihre zweite Lösung, obwohl sie stark von den Launen abhängtfile
und möglicherweise nicht in einem nicht englischen Gebietsschema funktioniert.Verwenden
cat -A
Wenn diese Datei in * NIX-Systemen erstellt wurde, wird sie angezeigt
Wenn diese Datei jedoch in Windows erstellt wurde, wird sie angezeigt
^M
repräsentiertCR
und$
repräsentiertLF
. Beachten Sie, dass Windows die letzte Zeile nicht mit gespeichert hatCRLF
Dies ändert auch nicht den Inhalt der Datei.
quelle
-A
um Katze. Ein Tipp wäre allerdings,cat -A file | less
wenn die Datei zu groß ist. Ich bin mir sicher, dass es nicht ungewöhnlich ist, Dateiendungen auf besonders lange Dateien prüfen zu müssen. (q
Eine Bash-Funktion für Sie:
Dann kannst du sowas machen
quelle
isDosFile()
in Ihrem Beispiel:streamFile() { sed 's/\r$//' "$1" ; }
.Wenn eine Datei CR-LF-Zeilenenden im DOS- / Windows-Stil enthält, werden bei der Anzeige mit einem Unix-basierten Tool am Ende jeder Zeile CR-Zeichen ('\ r') angezeigt.
Dieser Befehl:
wird gedruckt,
filename
wenn die Datei eine oder mehrere Zeilen mit Windows-ähnlichen Zeilenenden enthält, und es wird nichts gedruckt, wenn dies nicht der Fall ist. Das^M
muss jedoch ein Zeilenumbruchzeichen sein, das normalerweise in das Terminal eingegeben wird, indem Sie Ctrl+ Vgefolgt von Enter (oder Ctrl+ Vund dann Ctrl+ M) eingeben . Mit der Bash-Shell können Sie einen wörtlichen Wagenrücklauf als$'\r'
( hier dokumentiert ) schreiben, sodass Sie Folgendes schreiben können:Andere Schalen bieten möglicherweise ein ähnliches Merkmal.
Sie können stattdessen ein anderes Tool verwenden:
Dies wird mit dem Status
1
(Einstellung$?
auf1
) beendet, wenn die Datei Zeilenenden im Windows-Stil enthält, und mit dem Status,0
wenn dies nicht der Fall ist, was sie in einer Shell-if
Anweisung nützlich macht (beachten Sie das Fehlen von[
Klammern]
):Eine Datei kann eine Mischung aus Zeilenenden im Unix- und Windows-Stil enthalten. Ich gehe davon aus, dass hier Sie Dateien erkennen mögen, haben alle im Windows-Stil Zeilenende.
quelle
$'\r'
, wie in den anderen Antworten auf diese Frage angegeben.Verwendung
file
:quelle
Ich habe verwendet
was zu funktionieren scheint. Ich finde die Ausgabe etwas leichter zu lesen als
Es ist auch nützlich, wenn Sie
dos2unix
aus irgendeinem Grund nicht installieren können .quelle