Co to jest „^ M” i jak się go pozbyć?

Kiedy otwieram plik w Vimie, widzę dziwne ^M znaki.

Niestety ulubiona wyszukiwarka świata nie radzi sobie dobrze ze znakami specjalnymi w zapytaniach, więc pytam tutaj:

  • Co to jest ^M postać?

  • Jak to się mogło tam dostać?

  • Jak się go pozbyć?

Komentarze

  • It ' to znak kontrolny digraf, więcej informacji info: help digraph-table.
  • VS Code ma na dole opcję EOL, która automatycznie konwertuje otwarty plik.
  • @StackUnderflow podczas używania VSCode, zmiana końcówek linii na LF podczas pracy z plikami linux pomaga. Używam WSL … Plik systemu Windows taki jak $ profile nie ma problemu z plikiem Linuksa kończącym się LF. Może Win pokonuje tutaj Linuksa.

Odpowiedź

^M jest znakiem powrotu karetki. Jeśli to widzisz, prawdopodobnie patrzysz na plik, który powstał w świecie DOS / Windows, gdzie koniec linii jest oznaczony parą powrót karetki / znak nowej linii, podczas gdy w świecie uniksowym koniec linii jest oznaczony pojedynczym znakiem nowej linii.

Przeczytaj ten artykuł , aby uzyskać więcej informacji, a także wpis w Wikipedii dotyczący nowa linia .

Ten artykuł omawia, jak skonfigurować Vima do przezroczystej edycji plików o różnych końcach znaczniki linii.

Jeśli masz plik z ^M na końcu niektórych linii i chcesz się ich pozbyć, użyj tego w Vimie:

:s/^M$// 

(Naciśnij klawisze Ctrl + V Ctrl + M , aby wstawić to ^M.)

Komentarze

  • Spróbuj zamiast tego usunąć ^M i zastąpić ^M znakiem nowej linii . Bez % polecenie dotyczy tylko bieżącego wiersza. I natrafiłem na kilka przykładów, w których ^M nie znajduje się na końcu linii, na przykład The first line.^MThe second line.
  • Lub jeśli nie ' nie chcę mnóstwa znaków końca linii, które możesz po prostu wykonać :%s/^M/
  • Jeśli to ' jest po prostu samym powrotem karetki, może to być klasyczny (przed Uniksem) podział wiersza na Macintosha. Nawet niektóre nowsze programy, takie jak Excel 2007 dla komputerów Mac, robią to z jakiegoś powodu.
  • @larsks Ale altap.cz/salamander/help/salamand/appendix_txtfiles mówi, że ^M jest używane w systemie UNIX
  • Nie jestem pewien, czy ' jest coś w mojej konfiguracji vima, ale muszę wpisać Ctrl+Q, a następnie Ctrl+M, aby wygenerować ten znak!

Odpowiedź

Prostszym sposobem na to jest użycie następującego polecenia:

dos2unix filename 

To polecenie działa również z wzorcami ścieżek, np.

dos2unix path/name* 

Jeśli to nie działa, spróbuj użyć innego trybu:

dos2unix -c mac filename 
  • -c Ustaw tryb konwersji. Gdzie CONVMODE jest jednym z: ascii, 7bit, iso, mac z ascii jako domyślnym.

Komentarze

  • +1 za wzmiankę o domyślnej wartości flagi -c i innych opcjach. Przy pierwszej próbie wartość domyślna ' nie przyniosła oczekiwanych rezultatów. Z dos2unix -c max udało się. dos2unix: converting file launch_me.sh to Unix format...
  • Niesamowite małe narzędzie. W przypadku Ubuntu po prostu apt-get install dos2unix. Jeśli chcesz używać go rekurencyjnie, możesz skorzystać z tego rozwiązania tutaj: stackoverflow.com/questions/11929461/… Głupio uruchomiłem go ręcznie na każdym katalogu i pomyślałem tylko o sprawdzeniu tego faktu.

Odpowiedź

U mnie to zadziałało

:e ++ff=dos 

Polecenie: e ++ ff = dos mówi Vimowi, aby ponownie przeczytał plik, wymuszając format pliku dos. Vim usunie zakończenia linii tylko dla CRLF i LF, pozostawiając tylko tekst każdej linii w buforze.

potem

:set ff=unix 

i na koniec

:wq 

Komentarze

  • dzięki! to zadziałało dla mnie, ale zaakceptowane rozwiązanie nie zadziałało
  • Czy ff odnosi się do formatu pliku? A co z ++ff?
  • Polecenie: e ++ ff = dos mówi Vimowi, aby ponownie przeczytał plik, wymuszając format pliku dos. Vim usunie zakończenia linii tylko dla CRLF i LF, pozostawiając tylko tekst każdej linii w buforze.
  • Aby dowiedzieć się więcej o ff, wykonaj „: help ff ”
  • proste i skuteczne . Nie wiem, dlaczego cat file1 > > file2 wprowadza wysuwane wiersze DOS, skoro plik 1 nie ' na pierwszym miejscu

Odpowiedź

Większość systemów operacyjnych UNIX ma narzędzie o nazwie dos2unix, który przekształci CRLF w LF. Pozostałe odpowiedzi obejmują pytanie „czym one są”.

Odpowiedź

Innym sposobem na pozbycie się powrotu karetki jest użycie tr polecenie.

Mam mały skrypt, który wygląda następująco

#!/bin/sh tmpfile=$(mktemp) tr -d "\r" <"$1" >"$tmpfile" mv "$tmpfile" "$1" 

Odpowiedź

Możesz to uporządkować za pomocą sed:

sed -e "s/^M$//" < infile > outfile 

Sztuczka polega na tym, jak poprawnie wprowadzić znak powrotu karetki. Ogólnie rzecz biorąc, musisz wpisać C-v C-m, aby wprowadzić literalny powrót karetki. Możesz także ustawić seda w miejscu z

sed -i.bak -e "s/^M$//" infile 

Odpowiedz

Sed in -miejsce rozwiązanie bez konieczności wpisywania znaku specjalnego (możesz to skopiować i działa):

sed -i -e "s/\r//g" filename 

Wyjaśnienie:

-i: in-place -e: regular expression \r: escaped carriage return /g: replace globally 

Komentarze

  • Pytający już edytował plik w VIM, uwaga. A od 2012 roku istnieje sed odpowiedź na to miejsce.
  • Tak, ale brakowało dobrego, działającego rozwiązania. Istniejące rozwiązanie sed nie ' nie działa od razu po wyjęciu z pudełka.
  • Dale Hagglund ' s w -place sed zdecydowanie działa po wyjęciu z pudełka.
  • Cóż, nie dla mnie. I ' m na Ubuntu LTS 18.04.
  • Pomogło mi to edytować plik w Alpine Linux z pulpitu Windows, który liczyłby Ctrl M jako powrót linii, uczynienie powyższych odpowiedzi nieskutecznymi.

Odpowiedź

Co czy to jest ^ M?
^ M to znak powrotu karetki. Jeśli to widzisz, prawdopodobnie patrzysz na plik, który powstał w świecie DOS / Windows, gdzie koniec linii jest oznaczony parą powrót karetki / znak nowej linii, podczas gdy w świecie uniksowym koniec linii jest oznaczony pojedynczym znakiem nowej linii.

Jak mógł się tam dostać?
Kiedy tam to zmiana formatu pliku.

Jak się go pozbyć?
otwórz plik z

vim -b FILE_PATH 

zapisz go za pomocą następującego polecenia

:%s/^M//g 

Komentarze

  • ' masz literówkę w otwieraniu pliku filr za pomocą .
  • Ta odpowiedź nie dodaje niczego do innych odpowiedzi. Pierwszy akapit jest prawie dosłowną kopią zaakceptowanej odpowiedzi. Podany kod nie zapisuje niczego, a jedynie usuwa cały powrót karetki znaków ze wszystkich linii i nie jestem pewien, jak będzie wyglądało otwarcie pliku w trybie binarnym elp tutaj.

Odpowiedź

W moim przypadku

Nic powyżej nie zadziałało, ja miałem plik CSV skopiowany z mojego Maca na komputer z systemem Linux i użyłem wszystkich powyższych poleceń, ale nic nie pomogło oprócz poniższego

tr "\015" "\n" < inputfile > outputfile 

Miałem plik, w którym ^ M znaków zostało umieszczonych między wierszami, jak poniżej

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico, 

Komentarze

  • mac2unix -n inputfile outputfile lub równoważnie dos2unix -c mac -n inputfile outputfile poradzi sobie z tą sytuacją.

Odpowiedź

Możesz używać Vima w trybie Ex:

 ex -bsc "%s/\r//|x" file  
  1. -b tryb binarny

  2. % zaznacz wszystkie wiersze

  3. s podstawienie

  4. \r powrót karetki

  5. x zapisz i zamknij

Odpowiedź

Dodaj następujący wiersz do swojego ~ / .vimrc

command! Tounix :call Preserve("1,$s/^M//") 

Następnie, gdy masz plik z zakończeniami linii Windows, uruchom polecenie „: Tounix”.

Odpowiedź

W przeszłości widziałem, że nawet pliki konfiguracyjne nie były poprawnie analizowane i narzekali na białe znaki, ale jeśli i zrób listę zestawów, które nie „nie pokażą białych znaków”, nazwa pliku grep [[spacja]] pokaże ci ^ M

tak, gdy dos2unix file pomaga

Komentarze

  • Ta odpowiedź nie wnosi nic nowego, does2unix jest już wspomniane przynajmniej w dwóch znacznie starszych odpowiedziach.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *