Wat is `^ M` en hoe kom ik er vanaf?

Wanneer ik het bestand open in Vim, zie ik vreemde ^M tekens.

Helaas doet s werelds favoriete zoekmachine het niet goed met speciale tekens in zoekopdrachten, dus ik vraag hier:

  • Wat is dit ^M karakter?

  • Hoe kan het daar terecht zijn gekomen?

  • Hoe kom ik er vanaf?

Reacties

  • Het ‘ is een controleteken-digraph, voor meer info: help digraph-table.
  • VS Code heeft een EOL-optie onderaan die automatisch een geopend bestand converteert.
  • @StackUnderflow bij gebruik VSCode, het wijzigen van de regeleinde naar LF bij het werken aan linux-bestanden helpt. Ik gebruik WSL … Een Windows-bestand zoals $ profile heeft geen probleem met het Linux-bestand dat eindigt op LF. Misschien verslaat Win hier Linux.

Antwoord

De ^M is een regelterugloopkarakter. Als je dit ziet, kijk je waarschijnlijk naar een bestand dat afkomstig is uit de DOS / Windows-wereld, waar een end-of-line wordt gemarkeerd door een regelterugloop / nieuwe regel, terwijl in de Unix-wereld end-of-line wordt gemarkeerd door een enkele nieuwe regel.

Lees dit artikel voor meer details, en ook de Wikipedia-vermelding voor newline .

Dit artikel bespreekt hoe je vim kunt instellen om transparant bestanden met verschillende of-line markers.

Als je een bestand hebt met ^M aan het einde van enkele regels en je wilt ze verwijderen, gebruik dit dan in Vim:

:s/^M$// 

(Druk op Ctrl + V Ctrl + M om dat in te voegen ^M.)

Reacties

  • Probeer :%s/^M/\r/g om in plaats daarvan ^M te verwijderen en ^M te vervangen door een nieuwe regel . Zonder % is de opdracht alleen van toepassing op de huidige regel. En ik kwam enkele voorbeelden tegen waarbij ^M niet aan het einde van de regel staat, zoals The first line.^MThe second line.
  • Of als je don ‘ wil je niet veel regeleinden, je zou gewoon kunnen doen :%s/^M/
  • Als het ‘ is op zichzelf gewoon een regelterugloop, dat zou de klassieke (pre-Unix) Macintosh-regeleinde kunnen zijn. Zelfs sommige nieuwere programmas zoals Excel 2007 voor Mac doen dat om de een of andere reden.
  • @larsks Maar altap.cz/salamander/help/salamand/appendix_txtfiles zegt dat ^M wordt gebruikt in UNIX
  • Niet zeker of het ‘ iets is in mijn vim-configuratie, maar ik moet Ctrl+Q typen en vervolgens Ctrl+M om dat karakter te laten genereren!

Answer

Een eenvoudigere manier om dit te doen is door het volgende commando te gebruiken:

dos2unix filename 

Dit commando werkt ook met padpatronen, bijv.

dos2unix path/name* 

Als het niet werkt, probeer dan een andere modus:

dos2unix -c mac filename 
  • -c Conversiemodus instellen. Waar CONVMODE een is van: ascii, 7bit, iso, mac waarbij ascii de standaard is.

Opmerkingen

  • +1 voor vermelding van de standaardwaarde -c vlag en andere opties. Bij de eerste poging had de standaard ‘ niet de verwachte resultaten. Met dos2unix -c max werkte het. dos2unix: converting file launch_me.sh to Unix format...
  • Verbazingwekkend klein hulpprogramma. Voor ubuntu alleen apt-get install dos2unix. Als u het recursief moet gebruiken, kunt u hier naar deze oplossing verwijzen: stackoverflow.com/questions/11929461/… Ik heb het dwaas handmatig in elke directory uitgevoerd en dacht alleen achteraf op te zoeken.

Answer

Dit werkte voor mij

:e ++ff=dos 

Het: e ++ ff = dos commando vertelt Vim om het bestand opnieuw te lezen, waardoor het dos bestandsformaat geforceerd wordt. Vim verwijdert alleen CRLF- en LF-regeluitgangen, waardoor alleen de tekst van elke regel in de buffer blijft.

dan

:set ff=unix 

en tot slot

:wq 

Reacties

  • bedankt! dit werkte voor mij, maar de geaccepteerde oplossing werkte niet.
  • Verwijst ff naar het bestandsformaat? Hoe zit het met ++ff?
  • Het: e ++ ff = dos commando vertelt Vim om het bestand opnieuw te lezen, waardoor het dos bestandsformaat geforceerd wordt. Vim verwijdert alleen CRLF- en LF-regeleinden, waardoor alleen de tekst van elke regel in de buffer blijft.
  • Om meer te weten te komen over ff, voer je “: help ff ”
  • eenvoudig en effectief uit . Ik weet niet zeker waarom cat file1 > > file2 dos line feeds introduceert wanneer bestand 1 niet ‘ heb het in de eerste plaats

Answer

De meeste UNIX-besturingssystemen hebben een hulpprogramma genaamd dos2unix die de CRLF naar LF zal converteren. De andere antwoorden hebben betrekking op de “wat zijn ze” -vraag.

Antwoord

Een andere manier om de regelterugloop te verwijderen is met de tr commando.

Ik heb een klein script dat er zo uitziet

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

Antwoord

Je kunt dit opschonen met sed:

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

De truc is hoe je de regelterugloop correct invoert. Over het algemeen moet u C-v C-m typen om een letterlijke regelterugloop in te voeren. Je kunt sed ook laten werken met

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

Answer

Sed in -place oplossing zonder dat u het speciale teken hoeft in te typen (u kunt dit kopiëren en het werkt):

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

Uitleg:

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

Reacties

  • De vraagsteller was het bestand al aan het bewerken met VIM, let op. En er is een in-place sed antwoord hier sinds 2012.
  • Ja, maar er ontbrak een goede, werkende oplossing. De bestaande sed-oplossing werkt niet ‘ out-of-the-box.
  • Dale Hagglund ‘ s in -place sed werkt zeker uit de doos.
  • Nou, niet voor mij. Ik ‘ m op Ubuntu LTS 18.04.
  • Dit hielp me bij het bewerken van een bestand op Alpine Linux vanaf een Windows-desktop dat Ctrl M zou tellen als een regelteruggave, waardoor de bovenstaande antwoorden ondoeltreffend zijn.

Antwoord

Wat is dit ^ M?
De ^ M is een regelterugloop. Als je dit ziet, kijk je waarschijnlijk naar een bestand dat afkomstig is uit de DOS / Windows-wereld, waar een end-of-line wordt gemarkeerd door een regelterugloop / nieuwe regel, terwijl in de Unix-wereld end-of-line wordt gemarkeerd door een enkele nieuwe regel.

Hoe kon het daar komen?
Wanneer is een wijziging in bestandsformaat.

Hoe kom ik er vanaf?
open je bestand met

vim -b FILE_PATH 

sla het op met het volgende commando

:%s/^M//g 

Reacties

  • Je ‘ hebt een typefout gemaakt bij open je filr met .
  • Dit antwoord voegt niets toe aan de andere antwoorden. De eerste alinea is een bijna letterlijke kopie van het geaccepteerde antwoord. De gegeven code slaat niets op, maar verwijdert alle regelterugloop tekens uit alle regels. En ik weet niet zeker hoe het openen van het bestand in binaire modus zal h elp hier.

Antwoord

In mijn geval

Niets hierboven werkte, ik had een CSV-bestand gekopieerd naar de Linux-machine vanaf mijn Mac en ik gebruikte alle bovenstaande commandos maar niets hielp behalve de onderstaande

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

Ik had een bestand waarin ^ M-tekens zijn gesandwitched tussen regels zoals hieronder

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

Reacties

  • mac2unix -n inputfile outputfile, of, equivalent, dos2unix -c mac -n inputfile outputfile zal die situatie afhandelen.

Antwoord

Je kunt Vim gebruiken in de Ex-modus:

 ex -bsc "%s/\r//|x" file  
  1. -b binaire modus

  2. % selecteer alle regels

  3. s vervanger

  4. \r regelterugloop

  5. x opslaan en sluiten

Answer

Voeg de volgende regel toe aan je ~ / .vimrc

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

Als je een bestand hebt met de Windows-regeluitgangen, voer je het commando “: Tounix” uit.

Antwoord

In het verleden heb ik gezien dat zelfs configuratiebestanden niet correct werden geparseerd en klagen over witruimte, maar als je vi en maak een setlijst, het zal “niet de witruimte tonen, grep bestandsnaam [[spatie]] zal je ^ M laten zien

dat” is wanneer dos2unix file helpt

Reacties

  • Dit antwoord brengt niets nieuws op, does2unix wordt al genoemd in tenminste twee veel oudere antwoorden.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *