it-swarm-eu.dev

Co je `^ M` a jak se toho zbavím?

Když soubor otevřím ve Vimu, uvidím podivné ^M znaky.

Bohužel, oblíbený vyhledávací modul na světě nevyhovuje speciálním znakům v dotazech, proto se ptám zde:

  • Co je to ^M znak?

  • Jak se to tam mohlo dostat?

  • Jak se toho zbavím?

166
Christoph Wurm

The ^M je znak návratu vozíku. Pokud to vidíte, pravděpodobně se díváte na soubor, který vznikl ve světě DOS/Windows, kde je konec řádku označen dvojicí návrat/konec řádku, zatímco ve světě Unix konec konce řádku je označen jedním novým řádkem.

Přečtěte si tento článek pro více podrobností a také položku Wikipedia pro newline .

Tento článek popisuje, jak nastavit vim pro transparentní úpravy souborů pomocí různých značek na konci řádku.

Pokud máte soubor s ^M na konci některých řádků a chcete se jich zbavit, použijte to ve Vim:

:s/^M$//

(Lis Ctrl+VCtrl+M vložit to ^M.)

125
larsks

Jednodušší způsob, jak toho dosáhnout, je použít následující příkaz:

dos2unix filename

Tento příkaz funguje také se vzory cest, např

dos2unix path/name*

Pokud to nefunguje, zkuste použít jiný režim:

dos2unix -c mac filename
  • -c Nastavení režimu převodu. Kde CONVMODE je jedním z: ascii, 7bit, iso, mac s ascii jako výchozí.
49
AnonGeek

Většina operačních systémů UNIX má nástroj s názvem dos2unix, který převede CRLF na LF. Další odpovědi se týkají otázky „co jsou zač“.

41
Aaron Brown

To pro mě fungovalo

:e ++ff=dos 

Příkaz: e ++ ff = dos řekne Vimovi, aby znovu přečetl soubor, což nutí formát souboru dos. Vim odstraní konce řádků pouze CRLF a LF a ponechá pouze text každého řádku ve vyrovnávací paměti. =

pak

:set ff=unix 

a nakonec

:wq 
32
Stryker

Dalším způsobem, jak se zbavit návratů vozíku, je příkaz tr.

Mám malý skript, který vypadá takto

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

Můžete to vyčistit pomocí sed:

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

Trik spočívá v tom, jak správně zadat návrat vozíku. Obecně je třeba zadat C-v C-m pro zadání doslovného návratu vozíku. Můžete také mít zavedenou práci

sed -i.bak -e 's/^M$//' infile
7
Dale Hagglund

Co je to ^ M?
^ M je znak návratu vozíku. Pokud to vidíte, pravděpodobně se díváte na soubor, který vznikl ve světě DOS/Windows, kde je konec řádku označen dvojicí návrat/konec řádku, zatímco ve světě Unix konec konce řádku je označen jedním novým řádkem.

Jak se to tam mohlo dostat?
Když dojde ke změně formátu souboru.

Jak se toho zbavím?
Otevřete svůj soubor pomocí

vim -b FILE_PATH

uložte jej pomocí následujícího příkazu

:%s/^M//g
4
Prashant Kanse

V mém případě,

Nic výše nefungovalo, nechal jsem zkopírovat soubor CSV do počítače se systémem Linux z mého počítače Mac a všechny výše uvedené příkazy jsem použil, ale nic nepomohlo, ale pod jedním

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

Měl jsem soubor, ve kterém ^ M znaky byly přepnuty mezi řádky něco jako níže

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

Vim můžete použít v Ex režimu:

ex -bsc '%s/\r//|x' file
  1. -b binární režim

  2. % vyberte všechny řádky

  3. s náhradní

  4. \r vrácení vozu

  5. x uložit a zavřít

1
Steven Penny

Sed na místě řešení, aniž byste museli psát speciální znak (můžete to zkopírovat a funguje):

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

Vysvětlení:

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

Žádná z možností zde nefungovala.

Nakonec soubor otevřel v MS Word a voila the ^ M zmizela. Vyjmout a vložit do libovolného jiného editoru podle vašeho výběru.

0
user219042

V minulosti jsem viděl, že ani konfigurační soubory nejsou správně analyzovány a stěžují si na mezeru, ale pokud vi a provedete seznam souborů, nezobrazí mezeru, grep filename [[mezera]] vám ukáže ^ M

to je když dos2unix file pomáhá

0
Sriram

Přidejte následující řádek do svého ~/.vimrc

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

Poté, když máte soubor s koncovkami Windows, spusťte příkaz ": Tounix".

0
Charlie Dalsass