Co je to ^ ^ a jak se ho zbavím?

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

Bohužel světově oblíbený vyhledávač nefunguje dobře se speciálními znaky v dotazech, proto se ptám zde:

  • Co je to ^M charakter?

  • Jak se tam mohl dostat?

  • Jak se ho zbavím?

Komentáře

  • It ‚ sa ovládací znak digraph, pro více info: help digraph-table.
  • VS Code má dole možnost EOL, která automaticky převede otevřený soubor.
  • @StackUnderflow při použití VSCode, změna konců řádků na LF při práci na linuxových souborech pomáhá. Používám WSL … Soubor Windows, jako je $ profile, nemá problém s Linuxovým souborem končícím LF. Možná zde Win poráží Linux.

Odpověď

^M je znak návratu na začátek řádku. 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í carriage return / newline, zatímco ve světě Unixu je konec řádku je označen jedním novým řádkem.

Podrobněji si přečtěte tento článek a také položku Wikipedie pro nový řádek .

Tento článek pojednává o tom, jak nastavit vim pro transparentní úpravy souborů s různými koncovými of-line markers.

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

:s/^M$// 

(Stiskněte Ctrl + V Ctrl + M pro vložení ^M.)

Komentáře

  • Zkuste :%s/^M/\r/g místo toho odstranit ^M a nahradit ^M znakem nového řádku . Bez % se příkaz vztahuje pouze na aktuální řádek. A narazil jsem na několik příkladů, kde ^M není na konci řádku, například The first line.^MThe second line.
  • Nebo pokud nepotřebujete ‚ spoustu zalomení řádků, stačí :%s/^M/
  • pokud ‚ je jen návrat vozíku sám o sobě, může to být klasický konec řádku pro Macintosh (před Unixem). Dokonce i novější programy jako Excel 2007 pro Mac to z nějakého důvodu dělají.
  • @larsks But altap.cz/salamander/help/salamand/appendix_txtfiles říká, že ^M se používá v systému UNIX
  • nejsem si jistý, jestli ‚ něco v mém vim config, ale musím napsat Ctrl+Q a pak Ctrl+M, aby se tento znak vygeneroval!

Odpověď

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 nefunguje, zkuste použít jiný režim:

dos2unix -c mac filename 
  • -c Nastavit režim převodu. Kde CONVMODE je jeden z: ascii, 7bit, iso, mac s výchozím ascii.

Komentáře

  • +1 za zmínku o výchozí hodnotě příznaku -c a dalších možnostech. Při prvním pokusu výchozí ‚ neměl očekávané výsledky. S dos2unix -c max to fungovalo. dos2unix: converting file launch_me.sh to Unix format...
  • Úžasná malá utilita. Pro ubuntu stačí apt-get install dos2unix. Pokud jej potřebujete použít rekurzivně, můžete toto řešení odkázat zde: stackoverflow.com/questions/11929461/… Pošetile jsem to ručně spustil na každém adresáři a napadlo mě, abych se o to postaral.

Odpověď

Toto fungovalo pro mě

:e ++ff=dos 

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

then

:set ff=unix 

a nakonec

:wq 

Komentáře

  • díky! to fungovalo pro mě, ale přijaté řešení ne
  • Odkazuje ff na formát souboru? A co ++ff?
  • Příkaz: e ++ ff = dos řekne Vimovi, aby soubor přečetl znovu, a vynutí formát souboru dos. Vim odstraní konce řádků pouze CRLF a LF a ve vyrovnávací paměti ponechá pouze text každého řádku.
  • Chcete-li se o ff dozvědět více, proveďte „: help ff “
  • jednoduchý a efektivní . Nejsem si jistý, proč cat file1 > > file2 zavádí dos line feed, když soubor 1 ‚ na prvním místě

Odpověď

Většina operačních systémů UNIX má obslužný program s názvem dos2unix který převede CRLF na LF. Ostatní odpovědi pokrývají otázku „co jsou zač.“

Odpověď

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

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

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

Odpověď

Toto můžete 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 a zadat doslovný návrat vozíku. Můžete také nechat zavést sed pomocí

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

odpovědi

Sed v -místné řešení bez nutnosti psát speciální znaky (můžete je 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 

Komentáře

  • Tazatel již upravoval soubor pomocí VIM, poznámka. A od roku 2012 zde existuje místní sed odpověď.
  • Ano, ale chybělo dobré funkční řešení. Stávající řešení sed nepracuje ‚ připravené k okamžitému použití.
  • Dale Hagglund ‚ s -place sed rozhodně funguje po vybalení z krabice.
  • No, ne pro mě. ‚ m na Ubuntu LTS 18.04.
  • To mi pomohlo při úpravách souboru na Alpine Linux z plochy Windows, který by počítal Ctrl M jako návrat řádku, neúčinnost výše uvedených odpovědí.

Odpověď

Co je to ^ M?
^ M je znak návratu na začátek řádku. Pokud to uvidíte, pravděpodobně se díváte na soubor, který vznikl ve světě DOS / Windows, kde je konec řádku označen dvojicí carriage return / newline, zatímco ve světě Unixu je konec řádku je označen jedním novým řádkem.

Jak se tam mohlo dostat?
Kdy tam se mění formát souboru.

Jak se toho zbavím?
otevřete svůj soubor s

vim -b FILE_PATH 

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

:%s/^M//g 

Komentáře

  • Dostali jste ‚ překlep v otevřete soubor pomocí .
  • Tato odpověď nepřidává nic k ostatním odpovědím. První odstavec je téměř doslovná kopie přijaté odpovědi. Daný kód neuloží nic, ale pouze odstraní všechny vrácení vozíku znaků ze všech řádků. A nejsem si jistý, jak bude otevření souboru v binárním režimu h elp here.

Answer

V mém případě

Nic výše nefungovalo, já měl soubor CSV zkopírovaný na stroj Linux z mého macu a použil jsem všechny výše uvedené příkazy, ale nic nepomohlo, než ten níže uvedený

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

Měl jsem soubor, ve kterém ^ M znaky byly přepínány 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, 

Komentáře

  • mac2unix -n inputfile outputfile nebo ekvivalentně dos2unix -c mac -n inputfile outputfile tuto situaci vyřeší.

Odpovědět

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

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

  2. % vyberte všechny řádky

  3. s náhrada

  4. \r návrat vozíku

  5. x uložení a zavření

Odpověď

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

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

Pak, když máte soubor s konci řádků Windows, spusťte příkaz „: Tounix“.

Odpověď

V minulosti jsem viděl, že i konfigurační soubory nejsou správně analyzovány a stěžují si na prázdné znaky, ale pokud si vi a udělejte seznam, který nebude zobrazovat mezery, grep název souboru [[mezera]] vám ukáže ^ M

to je, když dos2unix file pomůže

Komentáře

  • Tato odpověď nepřináší nic nového, does2unix je již zmíněn alespoň ve dvou mnohem starších odpovědích.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *