Zamiana znaków końca linii (Windows CRLF, Unix LF, MacOS CR)

Enter: znaki nowej linii

Znaki końca linii to, wydawać by się mogło, sprawa trywialna. Zapewne wiele osób w ogóle nie ma pojęcia, że coś takiego istnieje 😉 Są jednak momenty, gdy znaki te mają znaczenie i decydują o działaniu skryptu czy też aplikacji.

Sposobów na zmianę znaków końca linii zapewne jest mnóstwo, ja postaram się przedstawić te najbardziej użytkowe – z użyciem IDE i gotowych skryptów. To, który sposób najlepiej w danym momencie zastosować, zależy tylko i wyłącznie od upodobań i aktualnych potrzeb. Co innego przecież skonwertować jeden plik, a co innego napakowany nimi katalog.

Na początek troszeczkę teorii. Znaki końca linii to \r (return) oraz \n (new line), które mogą pojawiać się pojedynczo lub razem. W zależności od systemu operacyjnego ich użycie jest inne, a wyróżnić można trzy rodzaje:

  • CR – wykorzystuje tylko \r, skrót pochodzi od anglojęzycznego zwrotu carriage return (powrót karetki)
  • LF – wykorzystuje tylko \n, skrót pochodzi od anglojęzycznego zwrotu line feed (w wolnym tłumaczeniu: nowa linia)
  • CRLF – połączenie obu powyższych, wykorzystuje \r\n

Tak prozaiczna sprawa potrafi wprowadzić niemały zamęt – otwieraliście kiedyś w windowsowym notatniku pliki pochodzenia unixowego? Wszystko jest wyświetlone ciurkiem i nie można się połapać co jest gdzie. Dlatego współdzielenie danych w plikach wykorzystywanych przez aplikacje uruchamiane na różnych systemach bywa kłopotliwe i nieprawidłowa obsługa znaków końca linii może doprowadzić do tego, że coś, co teoretycznie zaprogramowane jest prawidłowo, nie będzie działało. Można też natknąć się na inne problemy związane ze znakami końca linii, jak choćby „błąd składni” w plikach po klonowaniu repozytorium Git.

Eclipse

W Eclipse obsługa znaków końca linii jest bardzo prosta – mając w edytorze otwarty plik możemy skorzystać z menu File » Convert Line Delimiters To. Jeśli nie jesteśmy pewni jakie znaki końca linii są w naszym pliku, możemy prosto włączyć ich pokazywanie:

Eclipse: pokaż białe znaki

Jeśli nie widzimy w Eclipse powyżej użytego guzika lub pozycji menu, możemy przekonfigurować naszą przestrzeń roboczą. W tym celu wybieramy z menu Window » Customize Perspective… i zaznaczamy odpowiednie opcje:

Eclipse: dostosuj przestrzeń roboczą (toolbar) Eclipse: dostosuj przestrzeń roboczą (menu)

Znak \r wyświetlany jest jako ¤, a \n jako ¶ – zatem łatwo możemy rozpoznać jaki rodzaj końca linii wykorzystuje nasz plik (czasami pliki potrafią mieć pomieszane tryby, część linii może mieć LF, część CRLF). Po wybraniu z menu rodzaju zakończenia linii Eclipse nie sugeruje, że plik został zmieniony, więc ja dla pewności dodaję nową linię, kasuję ją i zapisuję zmiany.

NetBeans

Podobnie rzecz się ma z NetBeans. Obsługi znaków końca linii nie ma jednak w standardzie, więc musimy zainstalować wtyczkę Show and change line endings (Tools » Plugins):

NetBeans: Wtyczka operująca znakami końca linii

Po instalacji w naszym IDE pojawi się nowa opcja, ale łatwo ją przegapić bo jest mała i ukryta w prawym dolnym rogu okna programu:

NetBeans: zmień znaki końca linii

W odróżnieniu do Eclipse’a w NetBeans nawet gdy wyświetlimy niedrukowalne znaki (View » Show non-printable characters), to znakiem końca linii zawsze jest ¶, więc jedyną informacją o typie końca linii jest powyżej przedstawione pole dodane przez wcześniej zainstalowaną wtyczkę. Za to po zmianie znaków końca linii NetBeans sygnalizuje edycję pogrubieniem nazwy pliku w otwartej zakładce – wystarczy zapisać i gotowe.

dos2unix / unix2dos

W systemach Unix, a także w środowisku Cygwin dostępne są pakiety dos2unix i unix2dos. Dzięki nim możemy w prosty sposób skonwertować pliki i w odróżnieniu do Eclipse i NetBeans możemy robić to wsadowo (masowo). Jeśli więc potrzebujemy skonwertować wiele plików, jest to znacznie lepsza opcja.

Załóżmy, że mamy katalog CRLF Files i chcemy wszystkie zawarte w nim pliki skonwertować do LF. Z poziomu konsoli wystarczy wywołać polecenie find . -exec dos2unix --quiet {} \; (będąc w folderze CRLF Files) i już – wszystkie znalezione wewnątrz katalogu pliki zostaną skonwertowane. Jeśli chcemy, by wyświetlało nam wszystkie informacje o konwersji, czyli:

1
2
3
4
5
dos2unix: Skipping ., not a regular file.
dos2unix: Skipping ./.git, not a regular file.
dos2unix: converting file ./.git/config to Unix format ...
dos2unix: converting file ./.git/description to Unix format ...
(...)

(w zależności od zawartości katalogu może być tego mało lub baaaaardzo dużo), to należy pominąć opcję --quiet.

Skomentuj "Zamiana znaków końca linii (Windows CRLF, Unix LF, MacOS CR)":

Musisz się zalogować, aby móc dodać komentarz.