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


134

Kiedy otwieram plik vim, widzę dziwne ^Mpostacie.

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

  • Co to za ^Mpostać?

  • Jak mógł się tam dostać?

  • Jak się tego pozbyć?


3
Vlastimil to była bezcelowa edycja. Mam odpowiedni czas przeszły w języku angielskim angielskim.
Jesse_b

1
Jest to digraph znak kontrolny, aby uzyskać więcej informacji: help digraph-table.
Eric Leschinski

Odpowiedzi:


107

^MTo znak powrotu karetki. Jeśli to widzisz, prawdopodobnie patrzysz na plik, który powstał w świecie DOS / Windows, w którym koniec linii jest oznaczony przez parę powrotu karetki / nowej linii, podczas gdy w świecie Unixa koniec linii jest oznaczony jedną nową linią.

Przeczytaj ten artykuł, aby uzyskać więcej szczegółów, a także wpis w Wikipedii dotyczący nowego wiersza .

W tym artykule opisano, jak skonfigurować vima do przezroczystej edycji plików za pomocą różnych znaczników końca linii.

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

:s/^M$//

(Naciśnij Ctrl+ V Ctrl+, Maby wstawić ^M.)


11
:%s/^M/\r/gZamiast tego spróbuj usunąć ^Mi zastąpić ^Mznakiem nowej linii \r. Bez %polecenia polecenie dotyczy tylko bieżącej linii. I natknąłem się na przykłady, w których ^Mnie ma końca linii, takie jakThe first line.^MThe second line.
George

Lub jeśli nie chcesz :%s/^M/
ostrożnie1

2
Jeśli jest to po prostu powrót karetki, może to być klasyczny podział linii Macintosh (wcześniejszy niż Unix). Nawet niektóre nowsze programy, takie jak Excel 2007 dla komputerów Mac, robią to z jakiegoś powodu.
sudo

@larsks Ale altap.cz/salamander/help/salamand/appendix_txtfiles mówi, że ^Mjest używany w systemie UNIX
Vivek

Artykuł, z którym się łączyłeś, mówi, że \njest używany w Uniksie, co jest poprawne. To jest kod ASCII 10, znany również jako ^J.
larsks

39

Większość systemów operacyjnych UNIX ma narzędzie o nazwie dos2unix, które konwertuje CRLF na LF. Pozostałe odpowiedzi obejmują pytanie „jakie są”.


36

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
  • -cUstaw tryb konwersji. Gdzie CONVMODE jest jednym z: ascii, 7bit, iso, macz asciidomyślnym.

22

To zadziałało dla mnie

:e ++ff=dos 

Komenda: e ++ ff = dos każe Vimowi ponownie odczytać plik, wymuszając format pliku dos. Vim usunie zakończenia linii tylko CRLF i LF, pozostawiając tylko tekst każdej linii w buforze.

następnie

:set ff=unix 

i w końcu

:wq 

3
dzięki! to zadziałało dla mnie, ale zaakceptowane rozwiązanie nie
fan Bjorks numer jeden

Czy ffodnosi się do formatu pliku? Co ++ff?
KcFnMi

Komenda: e ++ ff = dos każe Vimowi ponownie odczytać plik, wymuszając format pliku dos. Vim usunie zakończenia linii tylko CRLF i LF, pozostawiając tylko tekst każdej linii w buforze.
Stryker,

10

Innym sposobem na pozbycie się zwrotów karetki jest trpolecenie.

Mam mały skrypt, który wygląda tak

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

6

Możesz to wyczyścić za pomocą sed:

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

Sztuczka polega na tym, jak prawidłowo wprowadzić zwrot karetki. Ogólnie rzecz biorąc, musisz wpisać, C-v C-maby wprowadzić literalny znak powrotu karetki. Możesz także mieć możliwość pracy w miejscu

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

2

Co to jest ^ M?
^ M jest znakiem powrotu karetki. Jeśli to widzisz, prawdopodobnie patrzysz na plik, który powstał w świecie DOS / Windows, w którym koniec linii jest oznaczony przez parę powrotu karetki / nowej linii, podczas gdy w świecie Unixa koniec linii jest oznaczony jedną nową linią.

Jak mógł się tam dostać?
Gdy nastąpi zmiana formatu pliku.

Jak się tego pozbyć?
otwórz plik za pomocą

vim -b FILE_PATH

zapisz go za pomocą następującego polecenia

:%s/^M//g

Masz literówkę w otwartym filr .
Mateusz Piotrowski

4
Ta odpowiedź nie dodaje niczego do innych odpowiedzi. Pierwszy akapit jest niemal dosłowną kopią zaakceptowanej odpowiedzi. Podany kod niczego nie zapisze , ale po prostu usunie wszystkie znaki powrotu karetki ze wszystkich wierszy. I nie jestem pewien, jak pomoże tutaj otwarcie pliku w trybie binarnym.
Dubu

2

W moim przypadku,

Nic powyżej nie działało, miałem plik CSV skopiowany na maszynę z systemem Linux z mojego komputera Mac i użyłem wszystkich powyższych poleceń, ale nic nie pomogło poza tym poniżej

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

Miałem plik, w którym ^ M znaki były przełączane między wierszami coś w stylu 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,

0

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

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

  2. % wybierz wszystkie linie

  3. s zastąpić

  4. \r powrót karetki

  5. x Zapisz i zamknij


0

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

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

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


-1

W przeszłości widziałem, że nawet pliki konfiguracyjne nie są poprawnie analizowane i narzekają na białe znaki, ale jeśli wykonasz vi i ustawisz listę, to nie wyświetli białych znaków, nazwa pliku grep [[spacja]] pokaże ci ^ M

to wtedy dos2unix filepomaga


Ta odpowiedź nie wnosi nic nowego, czy22xx jest już wspomniany przynajmniej w dwóch odpowiedziach znacznie starszych.
Rui F Ribeiro
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.