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
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ładThe 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ępnieCtrl+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
zascii
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żniedos2unix -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
-
-b
tryb binarny -
%
zaznacz wszystkie wiersze -
s
podstawienie -
\r
powrót karetki -
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.
help digraph-table
.