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
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 eksempelThe 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
, deretterCtrl+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
medascii
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
-
-b
binærmodus -
%
velg alle linjene -
s
erstatning -
\r
vognretur -
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.
help digraph-table
.