Ce este „^ M“ și cum scap de el?

Când deschid fișierul în Vim, văd caractere ciudate ^M.

Din păcate, motorul de căutare preferat al lumii nu se descurcă bine cu caracterele speciale din interogări, așa că întreb aici:

  • Ce este acest ^M caracter?

  • Cum ar fi putut ajunge acolo?

  • Cum scap de el?

Comentarii

  • Este ‘ un grafic de caractere de control, pentru mai multe info: help digraph-table.
  • Codul VS are o opțiune EOL în partea de jos care va converti automat un fișier deschis.
  • @StackUnderflow când utilizați VSCode, schimbarea terminărilor de linie în LF atunci când lucrați la fișiere Linux vă ajută. Folosesc WSL … Un fișier Windows precum $ profile nu are nicio problemă cu fișierul Linux care termină LF. Poate că Win îl bate pe Linux aici.

Răspuns

^M este un personaj de întoarcere la trăsură. Dacă vedeți acest lucru, probabil că vă uitați la un fișier care a apărut în lumea DOS / Windows, unde un sfârșit de linie este marcat de o pereche returnare / linie nouă, în timp ce în lumea Unix, sfârșitul liniei este marcat de o singură linie nouă.

Citiți acest articol pentru mai multe detalii, precum și intrarea Wikipedia pentru newline .

Acest articol discută despre cum să configurați vim pentru a edita în mod transparent fișiere cu diferite marcatori de linie.

Dacă aveți un fișier cu ^M la sfârșitul unor linii și doriți să scăpați de ele, utilizați acest lucru în Vim:

:s/^M$// 

(Apăsați pe Ctrl + V Ctrl + M pentru a insera ^M.)

Comentarii

  • Încercați :%s/^M/\r/g în loc să eliminați ^M și înlocuiți ^M cu caracterul newline . Fără %, comanda se aplică numai pentru linia curentă. Și am dat peste câteva exemple în care ^M nu se află la sfârșitul liniei, cum ar fi The first line.^MThe second line.
  • Sau dacă nu ‘ nu doriți o mulțime de întreruperi de linie pe care le puteți face doar :%s/^M/
  • Dacă ‘ este doar o întoarcere de la căruță, care ar putea fi clasica (pre-Unix) linie de linie Macintosh. Chiar și unele programe mai noi, cum ar fi Excel 2007 pentru Mac, fac acest lucru dintr-un anumit motiv.
  • @larsks Dar altap.cz/salamander/help/salamand/appendix_txtfiles spune că ^M este utilizat în UNIX
  • Nu sunt sigur dacă ‘ este ceva în configurația mea vim, dar trebuie să scriu Ctrl+Q, apoi Ctrl+M pentru a genera acel caracter!

Răspuns

O modalitate mai simplă de a face acest lucru este să folosiți următoarea comandă:

dos2unix filename 

Această comandă funcționează și cu modele de cale, de ex.

dos2unix path/name* 

Dacă nu funcționează, încercați să utilizați un mod diferit:

dos2unix -c mac filename 
  • -c Setați modul de conversie. În cazul în care CONVMODE este unul dintre: ascii, 7bit, iso, mac cu ascii fiind implicit.

Comentarii

  • +1 pentru menționarea valorii implicite a steagului -c și a altor opțiuni. La prima încercare, valoarea implicită nu ‘ nu a avut rezultatele scontate. Cu dos2unix -c max a funcționat. dos2unix: converting file launch_me.sh to Unix format...
  • Puțină utilitate uimitoare. Pentru ubuntu doar apt-get install dos2unix. Dacă trebuie să o utilizați recursiv, puteți consulta această soluție aici: stackoverflow.com/questions/11929461/… L-am rulat prostește în fiecare director manual și m-am gândit doar să caut după fapt.

Răspuns

Acest lucru a funcționat pentru mine

:e ++ff=dos 

Comanda: e ++ ff = dos îi spune lui Vim să citească din nou fișierul, forțând formatul de fișier dos. Vim va elimina terminările de linie numai CRLF și LF, lăsând doar textul fiecărei linii în buffer.

apoi

:set ff=unix 

și în sfârșit

:wq 

Comentarii

  • mulțumesc! acest lucru a funcționat pentru mine, dar soluția acceptată nu a fost
  • ff se referă la formatul de fișier? Ce zici de ++ff?
  • Comanda: e ++ ff = dos îi spune lui Vim să citească din nou fișierul, forțând formatul de fișier dos. Vim va elimina terminările de linie numai CRLF și LF, lăsând doar textul fiecărei linii în buffer.
  • Pentru a afla despre ff, executați „: ajutor ff ”
  • simplu și eficient . Nu sunt sigur de ce pisica file1 > > file2 introduce dos line feed-uri când fișierul 1 nu ‘ nu îl aveți în primul rând

Răspuns

Majoritatea sistemelor de operare UNIX au un utilitar numit dos2unix care va converti CRLF în LF. Celelalte răspunsuri acoperă întrebarea „ce sunt ele”.

Răspuns

Un alt mod de a scăpa de returnările de transport este cu tr comandă.

Am un mic script care arată astfel

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

Răspuns

Puteți curăța acest lucru cu sed:

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

Trucul este cum să introduceți corect transportul-retur. În general, trebuie să tastați C-v C-m pentru a introduce o returnare literală a transportului. Puteți, de asemenea, să lucrați la sediu cu

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

Răspundeți

Sed în -soluție fără a fi nevoie să tastați caracterul special (puteți copia acest lucru și funcționează):

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

Explicație:

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

Comentarii

  • Persoana care a întrebat-o edita deja fișierul cu VIM, notă. Și a existat un răspuns la locul sed aici din 2012.
  • Da, dar lipsea o soluție bună și funcțională. Soluția sed existentă nu funcționează ‘ nu funcționează imediat.
  • Dale Hagglund ‘ este în -place sed cel mai sigur nu funcționează din cutie.
  • Ei bine, nu pentru mine. Am ‘ m pe Ubuntu LTS 18.04.
  • Acest lucru m-a ajutat să editez un fișier pe Alpine Linux de pe un desktop Windows care să numere Ctrl M ca o linie de retur, făcând ineficiente răspunsurile de mai sus.

Răspuns

Ce este acesta ^ M?
^ M este un caracter de întoarcere. Dacă vedeți acest lucru, probabil că vă uitați la un fișier care a apărut în lumea DOS / Windows, unde un sfârșit de linie este marcat de o pereche returnare / linie nouă, în timp ce în lumea Unix, sfârșitul liniei este marcat de o singură linie nouă.

Cum ar fi putut ajunge acolo?
Când există este schimbarea formatului de fișier.

Cum scap de el?
deschideți fișier cu

vim -b FILE_PATH 

salvează-l cu următoarea comandă

:%s/^M//g 

Comentarii

  • ‘ ai primit o greșeală de greșeală în deschiderea filrului cu .
  • Acest răspuns nu adaugă nimic la celelalte răspunsuri. Primul paragraf este o copie aproape textuală din răspunsul acceptat. Codul dat nu va salva nimic, ci doar elimină toate returnările de transport caractere din toate rândurile. Și nu sunt sigur cum va deschide fișierul în modul binar elp aici.

Răspuns

În cazul meu,

Nimic de mai sus nu a funcționat, eu am copiat un fișier CSV pe mașina Linux de pe mac-ul meu și am folosit toate comenzile de mai sus, dar nimic nu a ajutat decât cel de mai jos

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

Am avut un fișier în care ^ M caractere au fost comutate cu nisip între rânduri ceva de genul

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

Comentarii

  • mac2unix -n inputfile outputfile sau, în mod echivalent, dos2unix -c mac -n inputfile outputfile se va ocupa de situația respectivă.

Răspuns

Puteți utiliza Vim în modul Ex:

 ex -bsc "%s/\r//|x" file  
  1. -b mod binar

  2. % selectați toate liniile

  3. s substitut

  4. \r returnare transport

  5. x salvare și închidere

Răspuns

Adăugați următoarea linie în ~ / .vimrc

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

Apoi, când aveți un fișier cu terminările de linie Windows, rulați comanda „: Tounix”.

Răspuns

În trecut, am văzut că fișierele de configurare nu sunt analizate corect și se plâng de spațiul alb, dar dacă vi și faceți o listă de seturi pe care a câștigat-o „nu afișați spațiul alb, numele fișierului grep [[spațiu]] vă va arăta ^ M

că” s când dos2unix file vă ajută

Comentarii

  • Acest răspuns nu aduce nimic nou, does2unix este deja menționat cel puțin în două răspunsuri mult mai vechi.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *