Vad är ^ M och hur blir jag av med det?

När jag öppnar filen i Vim ser jag konstiga ^M tecken.

Tyvärr går världens favoritsökmotor inte bra med specialtecken i frågor, så jag frågar här:

  • Vad är detta ^M karaktär?

  • Hur kunde det ha kommit dit?

  • Hur blir jag av med det?

Kommentarer

  • Det ’ är en graf för kontrolltecken, för mer info: help digraph-table.
  • VS-kod har ett EOL-alternativ längst ner som automatiskt konverterar en öppen fil.
  • @StackUnderflow när du använder VSCode, att ändra radändarna till LF när du arbetar med Linux-filer hjälper. Jag använder WSL … En Windows-fil som $ profile har inga problem med att Linux-filen slutar LF. Kanske slår Win Linux här.

Svar

^M är en vagnreturkaraktär. Om du ser detta tittar du förmodligen på en fil som har sitt ursprung i DOS / Windows-världen, där en slutsträng är markerad med ett vagnretur / nylinjepar, medan i Unixvärlden markeras av en enda ny rad.

Läs den här artikeln för mer information, och även Wikipedia-posten för newline .

Denna artikel diskuterar hur du ställer in vim för att transparent redigera filer med olika slut- of-line markörer.

Om du har en fil med ^M i slutet av vissa rader och du vill bli av med dem, använd den här i Vim:

:s/^M$// 

(Tryck Ctrl + V Ctrl + M för att infoga den ^M.)

Kommentarer

  • Försök :%s/^M/\r/g istället för att ta bort ^M och ersätt ^M med newline-tecken . Utan % gäller kommandot endast för aktuell rad. Och jag stötte på några exempel där ^M inte är i slutet av raden, till exempel The first line.^MThe second line.
  • Eller om du don ’ vill inte ha massor av radbrytningar kan du bara göra :%s/^M/
  • Om det ’ är bara en vagnretur av sig själv, det kan vara den klassiska (före Unix) Macintosh-linjen. Även vissa nyare program som Excel 2007 för Mac gör det av någon anledning.
  • @larsks Men altap.cz/salamander/help/salamand/appendix_txtfiles säger att ^M används i UNIX
  • Inte säker på om det ’ är något i min vim-konfiguration, men jag måste skriva Ctrl+Q och sedan Ctrl+M för att få den karaktären att generera!

Svar

Ett enklare sätt att göra detta är att använda följande kommando:

dos2unix filename 

Det här kommandot fungerar också med sökmönster, t.ex.

dos2unix path/name* 

Om det inte fungerar, försök använda ett annat läge:

dos2unix -c mac filename 
  • -c Ställ in omvandlingsläge. Där CONVMODE är en av: ascii, 7bit, iso, mac med ascii som standard.

Kommentarer

  • +1 för att nämna standard-värdet för flaggan -c och andra alternativ. Vid första försöket hade standardvärdet ’ inte de förväntade resultaten. Med dos2unix -c max fungerade det. dos2unix: converting file launch_me.sh to Unix format...
  • Fantastiskt litet verktyg. För ubuntu bara apt-get install dos2unix. Om du behöver använda den rekursivt kan du hänvisa till den här lösningen här: stackoverflow.com/questions/11929461/… Jag körde det dåraktigt i varje katalog manuellt och tänkte bara leta efter faktum.

Svar

Detta fungerade för mig

:e ++ff=dos 

Kommandot: e ++ ff = dos ber Vim att läsa filen igen och tvingar dosfilformat. Vim tar bort CRLF- och LF-enda radändar och lämnar endast texten för varje rad i bufferten.

sedan

:set ff=unix 

och slutligen

:wq 

Kommentarer

  • tack! detta fungerade för mig men den accepterade lösningen inte
  • Avser ff filformat? Vad sägs om ++ff?
  • Kommandot: e ++ ff = dos säger till Vim att läsa filen igen och tvingar dosfilformat. Vim tar bort CRLF- och endast LF-radändar och lämnar endast texten för varje rad i bufferten.
  • För att lära dig mer om ff, kör ”: hjälp ff ”
  • enkelt och effektivt . Jag är inte säker på varför cat file1 > > file2 introducerar doslinjeflöden när fil 1 inte ’ t har det i första hand

Svar

De flesta UNIX-operativsystem har ett verktyg som heter dos2unix som konverterar CRLF till LF. De andra svaren täcker frågan ”vad är de”.

Svar

Ett annat sätt att bli av med vagnreturer är med tr -kommando.

Jag har ett litet skript som ser ut så här

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

Svar

Du kan städa upp det med sed:

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

Tricket är hur man går in i vagnreturen ordentligt. Generellt måste du skriva C-v C-m för att ange en bokstavlig vagnretur. Du kan också ha sed-arbete på plats med

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

Svar

Sed in -platslösning utan att behöva skriva specialtecknet (du kan kopiera detta och det fungerar):

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

Förklaring:

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

Kommentarer

  • Frågeställaren redigerade redan filen med VIM, not. Och det har funnits ett sed svar på plats här sedan 2012.
  • Ja, men en bra, fungerande lösning saknades. Den befintliga sed-lösningen fungerar inte ’ t-out-of-the-box.
  • Dale Hagglund ’ s i -plats sed definitivt fungerar ur lådan.
  • Tja, inte för mig. Jag ’ m på Ubuntu LTS 18.04.
  • Detta hjälpte mig att redigera en fil på Alpine Linux från ett Windows-skrivbord som skulle räkna Ctrl M som en radretur, göra ovanstående svar ineffektiva.

Svar

Vad är det här ^ M?
^ M är ett vagnretur. Om du ser detta tittar du förmodligen på en fil som har sitt ursprung i DOS / Windows-världen, där en slutsträng markeras av ett vagnretur / nylinjepar, medan i Unixvärlden markeras av en enda ny rad.

Hur kunde det ha kommit dit?
När det är ändring i filformat.

Hur blir jag av med det? – öppna din fil med

vim -b FILE_PATH 

spara den med följande kommando

:%s/^M//g 

Kommentarer

  • Du ’ har fått ett stavfel i öppna din filr med .
  • Detta svar lägger inte till något till de andra svaren. Första stycket är en nästan fullständig kopia från det accepterade svaret. Den givna koden kommer inte att spara någonting, men bara ta bort all transportretur tecken från alla rader. Och jag är inte säker på hur man öppnar filen i binärt läge elp här.

Svar

I mitt fall

Ingenting ovan fungerade, jag hade kopierat en CSV-fil till Linux-maskinen från min mac och jag använde alla ovanstående kommandon men ingenting hjälpte utom den nedan

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

Jag hade en fil där ^ M-tecken sandbyttes mellan raderna något liknande nedan

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, likvärdigt, dos2unix -c mac -n inputfile outputfile hanterar den situationen.

Svar

Du kan använda Vim i Ex-läge:

 ex -bsc "%s/\r//|x" file  
  1. -b binärt läge

  2. % välj alla rader

  3. s ersättare

  4. \r vagnretur

  5. x spara och stäng

Svar

Lägg till följande rad i din ~ / .vimrc

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

Kör sedan kommandot ”: Tounix” när du har en fil med Windows-radändarna.

Svar

Tidigare har jag sett att även konfigurationsfilerna inte analyseras ordentligt och klagar på blanksteg, men om du och gör en lista som inte visar det vita utrymmet, grep filnamn [[space]] visar dig ^ M

att ”s när dos2unix file hjälper

Kommentarer

  • Det här svaret ger inte något nytt, do2unix nämns redan åtminstone i två svar mycket mer äldre.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *