Hvad er ^ M, og hvordan slipper jeg af det?

Når jeg åbner filen i Vim, ser jeg mærkelige ^M tegn.

Desværre klarer verdens favoritsøgemaskine sig ikke godt med specialtegn i forespørgsler, så jeg spørger her:

  • Hvad er dette ^M tegn?

  • Hvordan kunne det være kommet dertil?

  • Hvordan slipper jeg af det?

Kommentarer

  • Det ‘ en kontroltegngraf for mere info: help digraph-table.
  • VS-kode har en EOL-indstilling i bunden, der automatisk konverterer en åben fil.
  • @StackUnderflow, når du bruger VSCode, det hjælper med at ændre linieendelser til LF, når du arbejder på Linux-filer. Jeg bruger WSL … En Windows-fil som $ profile har ikke noget problem med Linux-fil, der slutter LF. Måske slår Win Linux her.

Svar

^M er en vognretur. Hvis du ser dette, ser du sandsynligvis på en fil, der stammer fra DOS / Windows-verdenen, hvor en slutning af linjen er markeret med et parretur / ny linjepar, mens i Unix-verdenen slutningen af linjen er markeret med en enkelt ny linje.

Læs denne artikel for flere detaljer, og også Wikipedia-posten for newline .

Denne artikel diskuterer, hvordan man konfigurerer vim til transparent redigering af filer med forskellige slut- of-line markører.

Hvis du har en fil med ^M i slutningen af nogle linjer, og du vil slippe af med dem, skal du bruge dette i Vim:

:s/^M$// 

(Tryk på Ctrl + V Ctrl + M for at indsætte den ^M.)

Kommentarer

  • Prøv :%s/^M/\r/g i stedet for at fjerne ^M og erstatte ^M med newline-tegn . Uden % gælder kommandoen kun for den aktuelle linje. Og jeg stødte på nogle eksempler, hvor ^M ikke er i slutningen af linjen, såsom The first line.^MThe second line.
  • Eller hvis du don ‘ ikke ønsker masser af linjeskift, du kan bare gøre :%s/^M/
  • Hvis det ‘ er bare en vognretur af sig selv, det kan være det klassiske Macintosh-linjeskift (før Unix). Selv nogle nyere programmer som Excel 2007 til Mac gør det af en eller anden grund.
  • @larsks Men altap.cz/salamander/help/salamand/appendix_txtfiles siger, at ^M bruges i UNIX
  • Ikke sikker på, om det ‘ er noget i min vim-konfiguration, men jeg skal skrive Ctrl+Q og derefter Ctrl+M for at få det tegn til at generere!

Svar

En enklere måde at gøre dette på er at bruge følgende kommando:

dos2unix filename 

Denne kommando fungerer også med kurvemønstre. F.eks.

dos2unix path/name* 

Hvis det ikke virker, så prøv at bruge en anden tilstand:

dos2unix -c mac filename 
  • -c Indstil konverteringstilstand. Hvor CONVMODE er en af: ascii, 7bit, iso, mac med ascii som standard.

Kommentarer

  • +1 for at nævne om -c-standardværdien og andre muligheder. Ved første forsøg havde standard ‘ ikke de forventede resultater. Med dos2unix -c max fungerede det. dos2unix: converting file launch_me.sh to Unix format...
  • Fantastisk lille hjælpeprogram. For ubuntu skal du bare apt-get install dos2unix. Hvis du har brug for det rekursivt, kan du henvise til denne løsning her: stackoverflow.com/questions/11929461/… Jeg kørte det tåbeligt manuelt på hver mappe og tænkte kun at se efter det.

Svar

Dette fungerede for mig

:e ++ff=dos 

Kommandoen: e ++ ff = dos fortæller Vim at læse filen igen og tvinger dos-filformat. Vim fjerner CRLF- og LF-eneste linieendelser og efterlader kun teksten for hver linje i bufferen.

derefter

:set ff=unix 

og til sidst

:wq 

Kommentarer

  • tak! dette fungerede for mig, men den accepterede løsning fungerede ikke
  • Henviser ff til filformat? Hvad med ++ff?
  • Kommandoen: e ++ ff = dos fortæller Vim at læse filen igen og tvinge dos-filformat. Vim fjerner CRLF- og LF-eneste linieendelser og efterlader kun teksten for hver linje i bufferen.
  • For at lære om ff skal du udføre “: hjælp ff ”
  • enkel og effektiv . Jeg er ikke sikker på, hvorfor cat file1 > > file2 introducerer dos line feeds, når fil 1 ikke ‘ t have det i første omgang

Svar

De fleste UNIX-operativsystemer har et værktøj kaldet dos2unix der konverterer CRLF til LF. De andre svar dækker spørgsmålet om “hvad er de”.

Svar

En anden måde at slippe af med vognreturerne er med tr kommando.

Jeg har et lille script, der ser sådan ud

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

Svar

Du kan rydde op med sed:

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

Tricket er, hvordan man kommer korrekt ind i vognreturen. Generelt skal du skrive C-v C-m for at indtaste en bogstavelig vognretur. Du kan også have sed-arbejde på plads med

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

Svar

Sed i -placering uden at skulle skrive specialtegnet (du kan kopiere dette, og det fungerer):

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

Forklaring:

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

Kommentarer

  • Spørggeren redigerede allerede filen med VIM, note. Og der har været et sted sed svar på stedet siden 2012.
  • Ja, men en god, fungerende løsning manglede. Den eksisterende sed-løsning fungerer ikke ‘ t out-of-the-box.
  • Dale Hagglund ‘ s i -sted sed bestemt fungerer uden for boksen.
  • Nå, ikke for mig. Jeg ‘ m på Ubuntu LTS 18.04.
  • Dette hjalp mig med at redigere en fil på Alpine Linux fra et Windows-skrivebord, der ville tælle Ctrl M som en linjeretur, gør ovenstående svar ineffektive.

Svar

Hvad er dette ^ M?
^ M er en vognretur. Hvis du ser dette, ser du sandsynligvis på en fil, der stammer fra DOS / Windows-verdenen, hvor en slutning af linjen er markeret med et vognretur / nyt linjepar, mens i Unix-verdenen slutningen af linjen er markeret med en enkelt ny linje.

Hvordan kunne det være kommet dertil?
Når der er ændring i filformat.

Hvordan slipper jeg af med det?
åbn din fil med

vim -b FILE_PATH 

gem den med følgende kommando

:%s/^M//g 

Kommentarer

  • Du ‘ har fået en tastefejl åbner din filr med .
  • Dette svar tilføjer ikke noget til de andre svar. Første afsnit er en næsten ordret kopi fra det accepterede svar. Den givne kode vil ikke gemme noget, men bare fjern al vognretur tegn fra alle linjer. Og jeg er ikke sikker på, hvordan åbning af filen i binær tilstand vil være h elp her.

Svar

I mit tilfælde

Intet ovenfor fungerede, jeg havde kopieret en CSV-fil til Linux-maskinen fra min mac, og jeg brugte alle ovenstående kommandoer, men intet hjalp andet end nedenstående

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

Jeg havde en fil, hvor ^ M-tegn blev sandwitched mellem linjer noget som nedenfor

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

Kommentarer

  • mac2unix -n inputfile outputfile eller ækvivalent dos2unix -c mac -n inputfile outputfile håndterer den situation.

Svar

Du kan bruge Vim i Ex-tilstand:

 ex -bsc "%s/\r//|x" file  
  1. -b binær tilstand

  2. % vælg alle linjer

  3. s erstatning

  4. \r vognretur

  5. x gem og luk

Svar

Føj følgende linje til din ~ / .vimrc

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

Kør derefter kommandoen “: Tounix”, når du har en fil med Windows-linieendelser.

Svar

Tidligere har jeg set, at selv konfigurationsfiler ikke parses ordentligt og klager over hvidt mellemrum, men hvis du vi og lav en sætliste, den vil ikke vise det hvide rum, grep filnavn [[space]] viser dig ^ M

at “s når dos2unix file hjælper

Kommentarer

  • Dette svar bringer ikke noget nyt, gør2unix allerede nævnt i det mindste i to svar meget mere ældre.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *