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 irgendwelche Schalter innerhalb
vi
,less
,more
, etc?Zusätzlich zu den Zeilenenden muss ich wissen, um welche Art von Zeilenende es sich handelt (
CRLF
oderLF
). Wie finde ich das heraus?
linux
bash
command-line
newline
line-endings
Marco Ceppi
quelle
quelle
man less
.Antworten:
Mit dem
file
Dienstprogramm können Sie die Art der Zeilenenden angeben.Unix:
"DOS":
So konvertieren Sie von "DOS" nach Unix:
So konvertieren Sie von Unix nach "DOS":
Das Konvertieren einer bereits konvertierten Datei hat keine Auswirkung, so dass es sicher ist, blind ausgeführt zu werden (dh ohne vorher das Format zu testen), obwohl wie immer die üblichen Haftungsausschlüsse gelten.
quelle
tofrodos
Paket explizit mit installierensudo apt-get install tofrodos
- genau so, wie Sie es ausführen müsstensudo apt-get install dos2unix
, umdos2unix
und zu erhaltenunix2dos
.dos2unix
scheitert? Das OP bei dieser Frage beschreibt das Problem nur vage.In
vi
...:set list
Zeilenenden zu sehen.:set nolist
wieder normal werden.Während ich glaube nicht , können Sie sehen ,
\n
oder\r\n
invi
, können Sie es (UNIX, DOS, etc.) zu schließen , welche Zeilenende hat Art von Datei sehen , welche ...:set ff
Alternativ können
bash
Sie die Retouren verwendenod -t c <filename>
oder nurod -c <filename>
anzeigen.quelle
:set fileformat
Gibt an, in welchem vonunix
oderdos
vim sich die Zeilenenden der Datei befinden. Sie können sie ändern, indem Sie:set fileformat=unix
.od -t c file/path
, aber danke für das neue Programm. Hat super funktioniert!Ubuntu 14.04:
einfach
cat -e <filename>
funktioniert gut.Dies zeigt Unix-Zeilenenden (
\n
oder LF) als$
und Windows-Zeilenenden (\r\n
oder CRLF) als an^M$
.quelle
.txt
Datei)Versuchen Sie es in der Bash-Shell
cat -v <filename>
. Dies sollte Wagenrückläufe für Windows-Dateien anzeigen.(Dies funktionierte bei mir in rxvt über Cygwin unter Windows XP).
Anmerkung des Herausgebers:
cat -v
Visualisiert\r
(CR) Zeichen. als^M
. Somit werden Zeilenendsequenzen\r\n
wie^M
am Ende jeder Ausgabezeile angezeigt .cat -e
wird zusätzlich visualisieren\n
, nämlich als$
. (cat -et
visualisiert zusätzlich Tabulatorzeichen. as^I
.)quelle
echo -e 'abc\ndef\r\n' | cat -v
und Sie sollten ein^M
nach dem "def" sehen.Es ist offen , CR als
^M
weniger nützlich anzuzeigenless -u
oder -ueinmal weniger zu tippen .man less
sagt:quelle
Versuchen Sie es
file
dannfile -k
danndos2unix -ih
file
wird in der Regel genug sein. Aber für schwierige Fälle versuchen Sie esfile -k
oderdosunix -ih
.Details unten.
Versuchen
file -k
Kurzfassung:
file -k somefile.txt
wird es Ihnen sagen.with CRLF line endings
für DOS / Windows-Zeilenenden ausgegeben .with LF line endings
für MAC-Leitungsenden ausgegeben .text
. (Wenn also keine Art von explizit erwähnt wird,line endings
bedeutet dies implizit: "CR-Zeilenenden" .)Langfassung siehe unten.
Beispiel aus der Praxis: Zertifikatcodierung
Ich muss dies manchmal auf PEM-Zertifikatdateien überprüfen.
Das Problem mit regulären
file
ist folgendes: Manchmal wird versucht, zu klug / 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 regelmäßig
file
:Huh. Es sagt mir nicht die Zeilenenden. Und ich wusste bereits , dass dies Zertifizierungsdateien waren. Ich brauchte keine "Datei", um mir das zu sagen.
Was können Sie noch versuchen?
Sie können es
dos2unix
mit dem--info
Schalter folgendermaßen versuchen :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 die
--keep-going
(oder-k
kurz gesagt) Option infile
:Ausgezeichnet! Jetzt wissen wir, dass unsere ungerade Datei DOS (
CRLF
) -Zeilenenden hat. (Und die anderen Dateien haben Unix (LF
) -Zeilenenden. Dies ist in dieser Ausgabe nicht explizit. Es ist implizit. Es ist genau so, wie esfile
eine "normale" 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:
Gut. Jetzt haben alle Zertifikate Unix-Zeilenenden.
Versuchen
dos2unix -ih
Ich wusste das nicht, als ich das obige Beispiel schrieb, aber:
Tatsächlich stellt sich heraus, dass dos2unix Ihnen eine Kopfzeile gibt, wenn Sie
-ih
(kurz für--info=h
) wie folgt verwenden :Und noch ein "tatsächlicher" Moment: Das Header-Format ist wirklich leicht zu merken: Hier sind zwei Mnemoniken:
Weiterführende Literatur
man file
man dos2unix
quelle
Accounts.java: Java source, ASCII text\012-
unter Windows in MinTTYfile -k Accounts.java
in der Münze versucht , die auch mit Git-for-Windows geliefert wird, aber meine Version istgit version 2.21.0.windows.1
cat -e file_to_test
Sie können
xxd
einen Hex-Dump der Datei anzeigen und nach Zeichen "0d0a" oder "0a" suchen.Sie können verwenden,
cat -v <filename>
wie @warriorpostman vorschlägt.quelle
Mit dem Befehl können Sie
todos filename
in DOS-Endungen undfromdos filename
in UNIX-Zeilenenden konvertieren. Geben Sie Folgendes ein, um das Paket unter Ubuntu zu installierensudo apt-get install tofrodos
.quelle
Sie können
vim -b filename
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, und zeigt die Zeilenenden von Windows CRLF an. Mit LF meine ich\n
und mit CR meine ich\r
. Beachten Sie, dass bei Verwendung der Option -b die Datei standardmäßig immer im UNIX-Modus bearbeitet wird, wie[unix]
in der Statuszeile angegeben. Wenn Sie also neue Zeilen hinzufügen, enden diese mit LF und nicht mit CRLF. Wenn Sie normales vim ohne -b für eine Datei mit CRLF-Zeilenenden verwenden, sollte[dos]
dies in der Statuszeile angezeigt werden, und eingefügte Zeilen haben CRLF als Zeilenende. Die vim-Dokumentation zumfileformats
Einstellen erklärt die Komplexität.Außerdem habe ich nicht genügend Punkte, um die Notepad ++ - Antwort zu kommentieren. Wenn Sie jedoch 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 der LF durch eine neue Zeile angezeigt wird.
quelle
Ich speichere meine Ausgabe in eine Textdatei. Ich öffne es dann in Notepad ++ und klicke dann auf die Schaltfläche Alle Zeichen anzeigen. Nicht sehr elegant, aber es funktioniert.
quelle
Vim - Windows-Zeilenumbrüche immer als anzeigen
^M
Wenn Sie es vorziehen, die Windows-Zeilenumbrüche in vim render as immer als anzuzeigen
^M
, können Sie diese Zeile zu Ihrem hinzufügen.vimrc
:Dadurch interpretiert vim jede geöffnete Datei als Unix-Datei. Da Unix-Dateien
\n
das Zeilenumbruchzeichen haben, wird eine Windows-Datei mit dem Zeilenumbruchzeichen\r\n
(dank\n
) weiterhin ordnungsgemäß gerendert, jedoch^M
am Ende der Datei (so rendert vim das\r
Zeichen).Vim - zeigt manchmal Windows-Zeilenumbrüche an
Wenn Sie es vorziehen, es nur pro Datei festzulegen, können Sie es
:e ++ff=unix
beim Bearbeiten einer bestimmten Datei verwenden.Vim - zeige immer den Dateityp (
unix
vsdos
)Wenn Sie in der unteren Zeile von Vim immer angezeigt werden soll , was Sie bearbeiten , Dateityp (und Sie nicht den Dateityp auf Unix eingestellte Kraft) können Sie Ihre hinzufügen
statusline
mitset statusline+=\ %{&fileencoding?&fileencoding:&encoding}
.Meine vollständige Statuszeile finden Sie unten. Fügen Sie es einfach zu Ihrem hinzu
.vimrc
.Es wird wie rendern
am Ende Ihrer Datei
Vim - manchmal Dateityp anzeigen (
unix
vsdos
)Wenn Sie nur sehen möchten, welchen Dateityp Sie haben, können Sie ihn verwenden
:set fileformat
(dies funktioniert nicht, wenn Sie den Dateityp zwangsweise festgelegt haben). Es wirdunix
für Unix-Dateien unddos
für Windows zurückgegeben.quelle