Próbuję użyć czegoś w bash, aby pokazać mi zakończenia linii w pliku drukowanym, a nie interpretowanym. Plik jest zrzutem z SSIS / SQL Server wczytywanego przez maszynę z systemem Linux do przetwarzania.
Czy są jakieś przełączniki odległości
vi
,less
,more
itp?Oprócz zobaczenia końca linii, muszę wiedzieć, jaki to typ końca linii (
CRLF
lubLF
). Jak się tego dowiem?
linux
bash
command-line
newline
line-endings
Marco Ceppi
źródło
źródło
man less
.Odpowiedzi:
Możesz użyć tego
file
narzędzia, aby wskazać rodzaj zakończeń linii.Unix:
„DOS”:
Aby przekonwertować z „DOS” na Unix:
Aby przekonwertować z Uniksa na „DOS”:
Konwersja już przekonwertowanego pliku nie ma wpływu, więc można bezpiecznie uruchamiać na ślepo (tj. Bez uprzedniego przetestowania formatu), jak zwykle jednak obowiązują zwykłe zastrzeżenia.
źródło
tofrodos
pakietu za pomocąsudo apt-get install tofrodos
- tak jak trzeba by uruchomić isudo apt-get install dos2unix
uzyskać .dos2unix
unix2dos
dos2unix
zawodzi? OP na to pytanie tylko niejasno opisuje ten problem.W
vi
...:set list
aby zobaczyć zakończenia linii.:set nolist
wrócić do normalności.Chociaż nie sądzę, można zobaczyć,
\n
czy\r\n
wvi
można zobaczyć, jaki typ pliku jest (UNIX, DOS, itd.), Aby wnioskować, która linia ma zakończenia ...:set ff
Alternatywnie, ze
bash
można użyćod -t c <filename>
albo tylkood -c <filename>
do wyświetlania powraca.źródło
:set fileformat
poinformuje, który z nichunix
lubdos
vim uważa, że kończą się wiersze pliku. Możesz to zmienić:set fileformat=unix
.od -t c file/path
, ale dzięki za nowy program. Działa świetnie!Ubuntu 14.04:
proste
cat -e <filename>
działa dobrze.Wyświetla zakończenia linii Unix (
\n
lub LF) jako$
i zakończenia linii Windows (\r\n
lub CRLF) jako^M$
.źródło
.txt
plikiem)W powłoce bash spróbuj
cat -v <filename>
. To powinno wyświetlać znaki powrotu karetki dla plików Windows.(To działało dla mnie w rxvt przez Cygwin na Windows XP).
Nota edytora:
cat -v
wizualizuje\r
znaki (CR). jak^M
. Zatem\r\n
sekwencje kończące linię będą wyświetlane jak^M
na końcu każdej linii wyjściowej.cat -e
dodatkowo wizualizuje\n
, a mianowicie jako$
. (cat -et
dodatkowo zwizualizuje tabulatory. as^I
.)źródło
echo -e 'abc\ndef\r\n' | cat -v
i powinieneś zobaczyć napis^M
po „def”.Aby pokazać CR jako
^M
mniej używanyless -u
lub wpisz -uraz, gdy mniej jest otwarte.man less
mówi:źródło
Spróbuj
file
wtedyfile -k
następniedos2unix -ih
file
zwykle wystarczy. Ale w trudnych przypadkach spróbujfile -k
lubdosunix -ih
.Szczegóły poniżej.
Próbować
file -k
Krótka wersja:
file -k somefile.txt
powie ci.with CRLF line endings
dla zakończeń linii DOS / Windows.with LF line endings
dla zakończeń linii MAC.text
. (Jeśli więc nie wspomina o żadnym rodzaju,line endings
oznacza to domyślnie: „Zakończenia linii CR” .)Wersja długa patrz poniżej.
Przykład ze świata rzeczywistego: kodowanie certyfikatów
Czasami muszę to sprawdzić w przypadku plików certyfikatów PEM.
Problem ze zwykłym
file
jest taki: Czasami stara się być zbyt mądry / zbyt konkretny.Spróbujmy małego quizu: Mam trochę plików. Jeden z tych plików ma różne zakończenia linii. Który?
(Przy okazji: tak wygląda jeden z moich typowych katalogów „praca z certyfikatami”).
Spróbujmy regularnie
file
:Huh To nie mówi mi o zakończeniu linii. I już wiedziałem, że to były pliki cert. Nie potrzebowałem „pliku”, żeby mi to powiedzieć.
Co jeszcze możesz spróbować?
Możesz spróbować
dos2unix
z takim--info
przełącznikiem:To mówi ci, że: tak, „0.example.end.cer” musi być dziwnym mężczyzną. Ale jakie są zakończenia linii? Czy ty wiesz, format wyjściowy dos2unix na pamięć? (Ja nie.)
Ale na szczęście jest opcja
--keep-going
(lub-k
w skrócie) wfile
:Świetny! Teraz wiemy, że nasz nieparzysty plik ma
CRLF
zakończenia linii DOS ( ). (A inne pliki mająLF
końcówki wiersza Unix ( ). Nie jest to jednoznaczne na tym wyjściu. Jest niejawne. Po prostufile
oczekuje się, że będzie to „zwykły” plik tekstowy.)(Jeśli chcesz podzielić się moim mnemonikiem: „L” oznacza „Linux” i „LF”.)
Teraz przekonwertujmy winowajcę i spróbuj ponownie:
Dobrze. Teraz wszystkie certyfikaty mają zakończenia linii Uniksa.
Próbować
dos2unix -ih
Nie wiedziałem tego, pisząc powyższy przykład, ale:
Okazuje się, że dos2unix da ci nagłówek, jeśli użyjesz
-ih
(skrót od--info=h
):I jeszcze jeden „faktyczny” moment: format nagłówka jest naprawdę łatwy do zapamiętania: oto dwie mnemoniki:
Dalsza lektura
man file
man dos2unix
źródło
Accounts.java: Java source, ASCII text\012-
w systemie Windows w MinTTYfile -k Accounts.java
w mennicy, która pochodzi z git-for-windows, ale moja wersja jestgit version 2.21.0.windows.1
cat -e file_to_test
Możesz użyć
xxd
do wyświetlenia zrzutu heksadecymalnego pliku i przeszukiwać znaki „0d0a” lub „0a”.Możesz użyć,
cat -v <filename>
jak sugeruje @warriorpostman.źródło
Możesz użyć tego polecenia,
todos filename
aby przekonwertować na zakończenia DOS ifromdos filename
przekonwertować na zakończenia linii UNIX. Aby zainstalować pakiet na Ubuntu, wpiszsudo apt-get install tofrodos
.źródło
Możesz użyć
vim -b filename
do edycji pliku w trybie binarnym, który pokaże ^ M znaków do powrotu karetki, a nowy wiersz wskazuje na obecność LF, wskazując zakończenia linii Windows CRLF. Mam na myśli LF,\n
a CR mam na myśli\r
. Zauważ, że kiedy użyjesz opcji -b, plik zawsze będzie domyślnie edytowany w trybie UNIX, jak wskazuje[unix]
linia stanu, co oznacza, że jeśli dodasz nowe linie, kończą się na LF, a nie CRLF. Jeśli używasz normalnego vima bez -b na pliku z zakończeniami linii CRLF, powinieneś zobaczyć[dos]
pokazany w linii statusu, a wstawione linie będą miały CRLF jako koniec linii. Dokumentacja vima dotyczącafileformats
ustawiania wyjaśnia złożoność.Ponadto nie mam wystarczającej liczby punktów, aby skomentować odpowiedź Notepad ++, ale jeśli używasz Notepad ++ w systemie Windows, użyj menu Widok / Pokaż symbol / Pokaż koniec linii, aby wyświetlić CR i LF. W tym przypadku pokazane jest LF, natomiast dla vim LF jest oznaczone nową linią.
źródło
Zrzucam moje wyjście do pliku tekstowego. Następnie otwieram go w notatniku ++, a następnie kliknij przycisk pokaż wszystkie znaki. Niezbyt elegancki, ale działa.
źródło
Vim - zawsze pokazuj nowe linie Windows jako
^M
Jeśli wolisz zawsze widzieć nowe wiersze systemu Windows w renderowaniu vim jako
^M
, możesz dodać ten wiersz do.vimrc
:Spowoduje to, że vim będzie interpretował każdy otwierany plik jako plik unix. Ponieważ pliki unix mają
\n
znak nowej linii, plik systemu Windows o znaku nowej linii\r\n
będzie nadal renderowany poprawnie (dzięki\n
), ale będzie miał^M
na końcu pliku (tak jak vim renderuje\r
znak).Vim - czasami pokazuje nowe linie Windows
Jeśli wolisz ustawić go tylko dla poszczególnych plików, możesz użyć go
:e ++ff=unix
podczas edycji danego pliku.Vim - zawsze pokazuj typ pliku (
unix
vsdos
)Jeśli chcesz dolną linię vim, aby zawsze wyświetlać co filetype jesteś edycji (i nie zmuszał ustawić typ pliku na Unix) można dodać do
statusline
zset statusline+=\ %{&fileencoding?&fileencoding:&encoding}
.Moja pełna linia statusu znajduje się poniżej. Po prostu dodaj go do swojego
.vimrc
.Renderuje się jak
na dole pliku
Vim - czasami pokaż typ pliku (
unix
vsdos
)Jeśli chcesz tylko zobaczyć, jaki typ pliku masz, możesz użyć
:set fileformat
(to nie zadziała, jeśli wymusisz ustawienie typu pliku). Będzie to powrótunix
do plików UNIX idos
Windows.źródło