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
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, zoalsThe 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 vervolgensCtrl+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
waarbijascii
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
-
-b
binaire modus -
%
selecteer alle regels -
s
vervanger -
\r
regelterugloop -
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.
help digraph-table
.