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
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říkladThe 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 pakCtrl+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ímascii
.
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
-
-b
binární režim -
%
vyberte všechny řádky -
s
náhrada -
\r
návrat vozíku -
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.
help digraph-table
.