Hva er `^ M` og hvordan blir jeg kvitt det?

Når jeg åpner filen i Vim, ser jeg rare ^M tegn.

Dessverre gjør ikke verdens favoritt søkemotor seg bra med spesialtegn i spørsmål, så jeg spør her:

  • Hva er dette ^M karakter?

  • Hvordan kunne den ha kommet dit?

  • Hvordan blir jeg kvitt den?

Kommentarer

  • Det ‘ en kontrolltegrafikk, for mer info: help digraph-table.
  • VS Code har et EOL-alternativ nederst som automatisk konverterer en åpen fil.
  • @StackUnderflow når du bruker VSCode, endring av linjeavslutningene til LF når du arbeider med Linux-filer hjelper. Jeg bruker WSL … En Windows-fil som $ profile har ikke noe problem med Linux-fil som avslutter LF. Kanskje Win slår Linux her.

Svar

^M er en vognretur. Hvis du ser dette, ser du sannsynligvis på en fil som har sin opprinnelse i DOS / Windows-verdenen, hvor en end-of-line er preget av et vognretur / newline-par, mens det i Unix-verden er end-of-line er merket av en enkelt ny linje.

Les denne artikkelen for mer detaljer, og også Wikipedia-oppføringen for newline .

Denne artikkelen diskuterer hvordan du konfigurerer vim for å redigere filer på en transparent måte med forskjellige slutt- of-line markører.

Hvis du har en fil med ^M på slutten av noen linjer, og du vil bli kvitt dem, bruk dette i Vim:

:s/^M$// 

(Trykk Ctrl + V Ctrl + M for å sette inn ^M.)

Kommentarer

  • Prøv :%s/^M/\r/g i stedet for å fjerne ^M og erstatte ^M med newline-tegn . Uten % gjelder kommandoen bare for gjeldende linje. Og jeg kom over noen eksempler der ^M ikke er på slutten av linjen, for eksempel The first line.^MThe second line.
  • Eller hvis du ikke ‘ ikke vil ha masse linjeskift, du kan bare gjøre :%s/^M/
  • Hvis det ‘ er bare en vognretur av seg selv, det kan være det klassiske Macintosh-linjeskiftet (før Unix). Selv noen nyere programmer som Excel 2007 for Mac gjør det av en eller annen grunn.
  • @larsks Men altap.cz/salamander/help/salamand/appendix_txtfiles sier at ^M brukes i UNIX
  • Ikke sikker på om det ‘ er noe i min vim-konfigurasjon, men jeg må skrive Ctrl+Q, deretter Ctrl+M for å få tegnet til å generere!

Svar

En enklere måte å gjøre dette på er å bruke følgende kommando:

dos2unix filename 

Denne kommandoen fungerer også med banemønstre. F.eks.

dos2unix path/name* 

Hvis den ikke fungerer, kan du prøve å bruke en annen modus:

dos2unix -c mac filename 
  • -c Angi konverteringsmodus. Der CONVMODE er en av: ascii, 7bit, iso, mac med ascii som standard.

Kommentarer

  • +1 for å nevne standardverdien for -c flagg og andre alternativer. Ved første forsøk hadde ikke standard ‘ de forventede resultatene. Med dos2unix -c max fungerte det. dos2unix: converting file launch_me.sh to Unix format...
  • Utrolig lite verktøy. For ubuntu bare apt-get install dos2unix. Hvis du trenger å bruke den rekursivt, kan du referere til denne løsningen her: stackoverflow.com/questions/11929461/… Jeg kjørte det tullete på hver katalog manuelt og tenkte bare å se etter fakta.

Svar

Dette fungerte for meg

:e ++ff=dos 

Kommandoen: e ++ ff = dos forteller Vim å lese filen igjen, og tvinger dosfilformatet. Vim vil fjerne CRLF og bare LF-linjeavslutninger, slik at bare teksten til hver linje blir igjen i bufferen.

deretter

:set ff=unix 

og til slutt

:wq 

Kommentarer

  • takk! dette fungerte for meg, men den aksepterte løsningen gjorde ikke
  • Henviser ff til filformat? Hva med ++ff?
  • Kommandoen: e ++ ff = dos forteller Vim å lese filen igjen og tvinge dosfilformatet. Vim vil fjerne CRLF- og LF-bare linjeendelser, slik at bare teksten på hver linje blir igjen i bufferen.
  • For å lære om ff, kjør «: hjelp ff »
  • enkelt og effektivt . Jeg er ikke sikker på hvorfor cat file1 > > file2 introduserer doselinjefeeder når fil 1 ikke ‘ t ha det i utgangspunktet

Svar

De fleste UNIX-operativsystemer har et verktøy som heter dos2unix som vil konvertere CRLF til LF. De andre svarene dekker «hva er de» -spørsmålet.

Svar

En annen måte å bli kvitt vognreturene på er med tr kommando.

Jeg har et lite skript som ser slik ut

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

Svar

Du kan rydde opp i dette med sed:

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

Trikset er hvordan du går riktig inn i vognreturen. Vanligvis må du skrive C-v C-m for å angi en bokstavelig vognretur. Du kan også ha sed-arbeid på plass med

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

Svar

Sed i stedsløsning uten å måtte skrive spesialtegnet (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øreren redigerte allerede filen med VIM, merknad. Og det har vært et sted sed svar her siden 2012.
  • Ja, men en god, fungerende løsning manglet. Den eksisterende sed-løsningen fungerer ikke ‘ t-out-of-the-box.
  • Dale Hagglund ‘ s i -sted sed absolutt fungerer utenom boksen.
  • Vel, ikke for meg. Jeg ‘ m på Ubuntu LTS 18.04.
  • Dette hjalp meg med å redigere en fil på Alpine Linux fra et Windows-skrivebord som ville telle Ctrl M som en linjeretur, gjør svarene ovenfor ineffektive.

Svar

Hva er dette ^ M?
^ M er et vognretur. Hvis du ser dette, ser du sannsynligvis på en fil som har sin opprinnelse i DOS / Windows-verdenen, hvor en end-of-line er preget av et vognretur / newline-par, mens det i Unix-verden end-of-line er merket av en enkelt ny linje.

Hvordan kunne det ha kommet dit?
Når det er endring i filformat.

Hvordan blir jeg kvitt det?
åpne fil med

vim -b FILE_PATH 

lagre den med følgende kommando

:%s/^M//g 

Kommentarer

  • Du ‘ har fått en skrivefeil i åpner filr med .
  • Dette svaret legger ikke noe til de andre svarene. Første ledd er en nesten ordkopi fra det aksepterte svaret. Den gitte koden vil ikke lagre noe, men bare fjerne all vognretur tegn fra alle linjer. Og jeg er ikke sikker på hvordan åpning av filen i binærmodus vil h elp her.

Svar

I mitt tilfelle

Ingenting ovenfor fungerte, jeg hadde kopiert en CSV-fil til Linux-maskinen fra min mac, og jeg brukte alle ovennevnte kommandoer, men ingenting hjalp, men den nedenfor

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

Jeg hadde en fil der ^ M-tegn ble sandkoblet mellom linjene omtrent 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, tilsvarende, dos2unix -c mac -n inputfile outputfile vil håndtere den situasjonen.

Svar

Du kan bruke Vim i Ex-modus:

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

  2. % velg alle linjene

  3. s erstatning

  4. \r vognretur

  5. x lagre og lukk

Svar

Legg til følgende linje i ~ / .vimrc

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

Så når du har en fil med Windows-linjeavslutningene, kjører du kommandoen «: Tounix».

Svar

Tidligere har jeg sett at selv konfigurasjonsfiler ikke blir analysert ordentlig og klager på mellomrom, men hvis du og gjør en setteliste den vil ikke vise mellomrom, grep filnavn [[space]] vil vise deg ^ M

at «s når dos2unix file hjelper

Kommentarer

  • Dette svaret bringer ikke noe nytt, does2unix er allerede nevnt i det minste i to svar mye eldre.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *