it-swarm.com.de

Wie finde ich Zeilenenden in einer Textdatei heraus?

Ich versuche, etwas in bash zu verwenden, um mir die Zeilenenden in einer Datei anzuzeigen, die gedruckt und nicht interpretiert wird. Die Datei ist ein Speicherauszug von SSIS/SQL Server, der von einem Linux-Computer zur Verarbeitung eingelesen wird.

  • Gibt es Schalter in vi, less, more usw.?

  • Zusätzlich zu den Zeilenenden muss ich wissen, um welche Art von Zeilenende es sich handelt (CRLF oder LF). Wie finde ich das heraus?

248
Marco Ceppi

Mit dem Dienstprogramm file können Sie die Art der Zeilenenden anzeigen.

Unix:

$ file testfile1.txt
testfile.txt: ASCII text

"DOS":

$ file testfile2.txt
testfile2.txt: ASCII text, with CRLF line terminators

So konvertieren Sie von "DOS" nach Unix:

$ dos2unix testfile2.txt

So konvertieren Sie von Unix nach "DOS":

$ unix2dos testfile1.txt

Das Konvertieren einer bereits konvertierten Datei hat keine Auswirkung, daher ist es sicher, blind ausgeführt zu werden (d. H. Ohne das Format zuerst zu testen), obwohl wie immer die üblichen Haftungsausschlüsse gelten.

357

In vi...

:set list Um die Zeilenenden zu sehen.

:set nolist, Um zum Normalzustand zurückzukehren.

Ich glaube zwar nicht, dass Sie \n Oder \r\n In vi sehen können, aber Sie können sehen, um welchen Dateityp es sich handelt (UNIX, DOS usw.), um auf welchen zu schließen Zeilenenden hat es ...

:set ff

Alternativ können Sie in bashod -t c <filename> Oder nur od -c <filename> Verwenden, um die Retouren anzuzeigen.

120
Ryan Berger

Versuchen Sie in der Bash-Shell cat -v <filename>. Dies sollte Wagenrücklauf für Windows-Dateien anzeigen.

(Das hat bei mir in rxvt über Cygwin unter Windows XP funktioniert).

Anmerkung des Herausgebers: cat -v visualisiert \r (CR) Zeichen. wie ^M. Zeilenende \r\n Sequenzen werden als ^M am Ende jeder Ausgabezeile. cat -e visualisiert zusätzlich \n, nämlich als $. (cat -et visualisiert zusätzlich Tabulatoren. wie ^I.)

96
warriorpostman

Ubuntu 14.04:

einfaches cat -e <filename> funktioniert gut.

Dies zeigt Unix-Zeilenenden (\n oder LF) als $ und Windows-Zeilenenden (\r\n oder CRLF) als ^M$.

89

So zeigen Sie CR als ^M in weniger Gebrauch less -u oder Typ -u einmal weniger ist offen.

man less sagt:

-u or --underline-special

      Causes backspaces and carriage returns to be treated  as  print-
      able  characters;  that  is,  they are sent to the terminal when
      they appear in the input.
14
P. Kucerak

Sie können xxd verwenden, um einen hexadezimalen Speicherauszug der Datei anzuzeigen und nach "0d0a" - oder "0a" -Zeichen zu suchen.

Sie können cat -v <filename> wie @warriorpostman vorschlägt.

9
Rich

Probieren Sie "file -k"

Kurzfassung: file -k somefile.txt Wird es Ihnen sagen.

  • Es wird with CRLF line endings Für DOS/Windows-Zeilenenden ausgegeben.
  • Es wird with LF line endings Für MAC-Leitungsenden ausgegeben.
  • Und für Linux/Unix-Zeilen "CR" wird nur text ausgegeben. (Wenn also nicht explizit eine Art von line endings Erwähnt wird, bedeutet dies implizit: "CR-Zeilenenden".)

Lange Version siehe unten.


Anwendung in der Praxis: Zertifikatscodierung

Ich muss dies manchmal auf PEM-Zertifikatsdateien überprüfen.

Das Problem mit regulären file ist folgendes: Manchmal versucht es, zu schlau/zu spezifisch zu sein.

Versuchen wir ein kleines Quiz: Ich habe einige Dateien. Und eine dieser Dateien hat unterschiedliche Zeilenenden. Welcher?

(Übrigens: So sieht eines meiner typischen "Certificate Work" -Verzeichnisse aus.)

Versuchen wir es mit normalem file:

$ file -- *
0.example.end.cer:         PEM certificate
0.example.end.key:         PEM RSA private key
1.example.int.cer:         PEM certificate
2.example.root.cer:        PEM certificate
example.opensslconfig.ini: ASCII text
example.req:               PEM certificate request

Huh. Es sagt mir nicht die Zeilenenden. Und ich habe bereits gewusst, dass es sich um zertifizierte Dateien handelt. Ich brauchte keine "Akte", um mir das zu sagen.

Was können Sie noch versuchen?

Sie könnten versuchen, dos2unix Mit dem Schalter --info Wie folgt auszuführen:

$ dos2unix --info -- *
  37       0       0  no_bom    text    0.example.end.cer
   0      27       0  no_bom    text    0.example.end.key
   0      28       0  no_bom    text    1.example.int.cer
   0      25       0  no_bom    text    2.example.root.cer
   0      35       0  no_bom    text    example.opensslconfig.ini
   0      19       0  no_bom    text    example.req

Das sagt dir also: yup, "0.example.end.cer" muss der seltsame Mann sein. Aber welche Art von Zeilenenden gibt es? Kennen Sie das dos2unix-Ausgabeformat auswendig? (Ich nicht.)

Aber zum Glück gibt es in file die Option --keep-going (Oder kurz -k):

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text, with CRLF line terminators\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data

Ausgezeichnet! Jetzt wissen wir, dass unsere ungerade Datei DOS-Zeilenenden (CRLF) hat. (Und die anderen Dateien haben Unix-Zeilenenden (LF). Dies ist in dieser Ausgabe nicht explizit. Es ist implizit. Es ist genau so, wie file es von einer "normalen" Textdatei erwartet.)

(Wenn Sie meine Mnemonik teilen möchten: "L" steht für "Linux" und für "LF".)

Lassen Sie uns nun den Täter bekehren und es erneut versuchen:

$ dos2unix -- 0.example.end.cer

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data  

Gut. Jetzt haben alle Zertifikate Unix-Zeilenenden.

Weitere Lektüre

8
StackzOfZtuff

Mit vim -b filename Können Sie eine Datei im Binärmodus bearbeiten, in der ^ M Zeichen für den Wagenrücklauf angezeigt werden. Eine neue Zeile zeigt an, dass LF vorhanden ist, was auf eine Windows-CRLF-Zeile hinweist Endungen. Mit LF Ich meine \n und mit CR meine ich \r. Beachten Sie, dass die Datei bei Verwendung der Option -b immer unter UNIX bearbeitet wird Modus standardmäßig wie durch [unix] in der Statuszeile angegeben, dh wenn Sie neue Zeilen hinzufügen, enden diese mit LF, nicht mit CRLF. Wenn Sie normale vim ohne -b für eine Datei mit CRLF-Zeilenenden verwenden, haben Sie sollte [dos] in der Statuszeile angezeigt werden und eingefügte Zeilen haben CRLF als Zeilenende. Die vim-Dokumentation für die Einstellung fileformats erklärt die Komplexität.

Ich habe auch nicht genug Punkte, um die Notepad ++ - Antwort zu kommentieren, aber wenn Sie Notepad ++ unter Windows verwenden, verwenden Sie das Menü Ansicht/Symbol anzeigen/Zeilenende anzeigen, um CR und LF anzuzeigen. In diesem Fall wird LF angezeigt, während für vim LF= durch eine neue Zeile angezeigt wird.

4
smalers

Sie können den Befehl todos filename, um in DOS-Endungen zu konvertieren, und fromdos filename, um nach UNIX-Zeilenenden zu konvertieren. Um das Paket unter Ubuntu zu installieren, geben Sie Sudo apt-get install tofrodos.

4
Zorayr

Ich speichere meine Ausgabe in eine Textdatei. Ich öffne es dann im Editor ++ und klicke dann auf die Schaltfläche Alle Zeichen anzeigen. Nicht sehr elegant, aber es funktioniert.

0
Diego