Konwertuj zakończenia linii DOS na zakończenia linii Linux w vimie

717

Jeśli otworzę pliki utworzone w systemie Windows, wszystkie wiersze kończą się na ^M.
Jak mogę usunąć te znaki naraz?

Bert Hekman
źródło
Jeśli to zrobisz hexdump -C badfilei zobaczysz, 0x0d 0x0a "\r\n"że to twój problem.
Yzmir Ramirez

Odpowiedzi:

1074

dos2unix to narzędzie wiersza poleceń, które to zrobi, lub zrobi to, :%s/^M//gjeśli użyjesz Ctrl- v Ctrl- mdo wprowadzenia ^ M, lub możesz :set ff=unixi vim zrobi to za ciebie.

Dokumenty dotyczące ustawienia „format pliku” są tutaj , a wiki vim ma obszerną stronę konwersji kończących linię .

Alternatywnie, jeśli często przenosisz pliki tam i z powrotem, możesz nie chcieć ich konwertować, ale raczej zrobić :set ff=dos, więc vim będzie wiedział, że to plik DOS i użyje konwencji DOS dla zakończeń linii.

pjz
źródło
56
:%s/^M//gpowinno być :%s/\r//g, ponieważ ^Mpo prostu oznacza „dopasuj kapitał” M „na początku linii”.
Bunyk,
78
Nie, jeśli zrobisz tak, jak mówi odpowiedź i „użyj ctrl-v ctrl-m, aby wprowadzić ^ M”.
pjz
2
crtl-v nie jest dobry, w systemie Windows wkleja zawartość schowka do wiersza poleceń. Rozwiązanie :%s/\r//gdziałało dla mnie, pozdrawiam @Bunyk
roblogic
3
@ropata To, czego chcesz w systemie Windows, to ctrl-q .
ruffin
2
Coś mi brakuje, bo set ff=unixnic nie robi. Może konwertuje plik, ale wszystkie ^Mznaki wciąż tam są.
felwithe
276

Zmień zakończenia linii w widoku:

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

Można to również wykorzystać jako operację zapisywania (: sam w nie zapisuje przy użyciu zakończeń linii widocznych na ekranie):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

I możesz go użyć z wiersza polecenia:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done
Ludvig A. Norin
źródło
4
Dziękuję Ci bardzo. Próbowałem vi + ': wq ++ ff = unix' <ścieżka pliku> dla leniwego takiego jak ja.
a_secenthusiast
2
To powinna być najbardziej pozytywna odpowiedź. :w +ff=unixjest o wiele ładniejszy niż większość innych tu napisanych rzeczy, a skrypt bash jest miłym dodatkiem.
mkasberg,
Wydaje się, że :epolecenia nie działają w mojej instalacji Windows vim. Mój widok wciąż pokazuje ^Mkody.
Grant Birchmeier,
160

Zwykle używam

:%s/\r/\r/g

co wydaje się trochę dziwne, ale działa ze względu na sposób, w jaki vim dopasowuje linie. Łatwiej mi też zapamiętać :)


źródło
9
Działa to konsekwentnie na różnych platformach. Najlepsza odpowiedź tutaj.
thebigjc
4
Nigdy wcześniej nie miałem z tym problemu :set ff=unix, ale plik, który otworzyłem dzisiaj, musiał być szczególnie dziwny. Vim powiedział, że już było, fileformat=unixale wszystkie zakończenia linii były ^M. To rozwiązanie działało dla mnie.
Chris B
15
To rozwiązanie dodaje dla mnie niepożądane dodatkowe linie, podwajając liczbę linii w pliku. :%s/\r//gzamiast tego działa dla mnie.
Victor Zamanian
3
Victor, Twoje pliki prawdopodobnie mają \ r \ n końcówki. \ r nie jest czytany jako nowy wiersz, ale \ n jest. W plikach, na które wpadam są \ r i musisz dodać znak nowej linii.
Joeyjoejoejr
2
@ VictorZamanian's :%s/\r//gjest jedynym rozwiązaniem ogólnego zastosowania - szczególnie dla plików w trybie mieszanym zawierających heterogeniczną domieszkę nowych linii w stylu DOS i UNIX. Rozwiązania kanoniczne (np. ) Zakładają :set ff=unix, :e ++ff=unixże każda linia bieżącego bufora kończy się w tym samym stylu nowej linii. Czasami tak; czasami nie. Cue sadface.
Cecil Curry,
97

Wolę użyć następującego polecenia:

:set fileformat=unix

Możesz także użyć maclub dosodpowiednio przekonwertować plik na konwencję plików Macintosh lub MS-DOS / MS-Windows. I nic nie robi, jeśli plik ma już prawidłowy format.

Aby uzyskać więcej informacji, zobacz pomoc vima:

:help fileformat
Sylvain Defresne
źródło
1
Wydaje się, że to polecenie nie robi nic w moim systemie Windows vim. Mój pogląd wciąż zawiera ^Mznaki.
Grant Birchmeier,
set fileformat=unixDziała dodawanie do mojego pliku .vimrc.
Joey Allen,
20

:set fileformat=unix przekonwertować z dos na unix.


źródło
1
To faktycznie rozwiązało problem. Nie mogłem znaleźć tych postaci podczas wyszukiwania.
Kapitan Insaneo,
20
:%s/\r+//g

W Vimie usuwa wszystkie powrotne karetki i pozostawia tylko nowe linie.

mercutio
źródło
2
Z jakiegoś powodu powyższe nie działało dla mnie pod Windows GVIM. Ale po zmianie :%s/\r//gdziałał jak urok.
soltysh
1
@soltysh:% s / \ r \ + $ // g
thinker3
10

Konwertuj katalog plików z dos na Unix

Za pomocą wiersza polecenia i sed znajdź wszystkie pliki w bieżącym katalogu z rozszerzeniem „.ext” i usuń wszystkie „^ M”

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

także, jak wspomniano powyżej ^ M = Ctrl+V+ Ctrl+M(nie wpisuj po prostu symbolu karetki „^” i M)

Sparkida
źródło
9

dos2unix może bezpośrednio modyfikować zawartość pliku.

Możesz użyć go bezpośrednio w pliku, bez potrzeby tymczasowego przekierowania pliku.

dos2unix input.txt input.txt

Powyżej używa założonej klawiatury amerykańskiej. Użyj -opcji 437, aby korzystać z klawiatury brytyjskiej.

dos2unix -437 input.txt input.txt
Venkataramesh Kommoju
źródło
6

Poniższe kroki mogą przekonwertować format pliku dos na unix:

:e ++ff=dos  Edit file again, using dos file format ('fileformats' is ignored).[A 1]
:setlocal ff=unix    This buffer will use LF-only line endings when written.[A 2]
:w   Write buffer using unix (LF-only) line endings.

Odniesienie: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix

ajitomatix
źródło
6

Za pomocą następującego polecenia:

:%s/^M$//g 

Dostać ^Msię pojawiać typ CtrlVpotem CtrlM. CtrlVmówi Vimowi, by wziął następną literę wpisaną dosłownie.

Dave Webb
źródło
6

Komentowanie pojawienia się ^ M było tym, co zadziałało dla mnie. Samo wpisanie „^ M” w moim vi nic nie dało (nie znaleziono). Sekwencja CTRL+ V CTRL+ Mzrobiła to jednak doskonale.

Moje działające polecenie zastępowania było

:%s/Ctrl-V Ctrl-M/\r/g

i wyglądało to tak na moim ekranie:

:%s/^M/\r/g
Dannid
źródło
4
Możesz użyć :%szamiast :1,$s. %jest skrótem od 1,$.
Tin Man
5

Znalazłem bardzo prosty sposób: Otwórz plik za pomocą nano: nano file.txt

Naciśnij CTRL+, Oaby zapisać, ale przed naciśnięciem Enternaciśnij: ALT+, Daby przełączyć między zakończeniami linii DOS i Unix / Linux lub: ALT+, Maby przełączyć między zakończeniami linii Mac i Unix / Linux, a następnie naciśnij, Enteraby zapisać i CTRL+, Xaby wyjść.

Stefan Sjöberg
źródło
zrobiłem to na serwerze linux, plik miał ^Mzakończenia. zapisz jako dos, aby zachować, zapisz jako Linux, aby usunąć. można to sprawdzić za pomocącat -v
HattrickNZ
To pytanie dotyczy vima, a nie nano.
Grant Birchmeier,
5
:g/Ctrl-v Ctrl-m/s///

CtrlMto znak \rlub znak powrotu karetki, które dodają zakończenia linii DOS. CtrlVmówi vimowi, aby wstawił literalny CtrlMznak w linii poleceń.

Podsumowując, to polecenie zastępuje wszystko \rniczym, usuwając je z końców linii.

Rob Wells
źródło
4

Możesz użyć:

vim somefile.txt +"%s/\r/\r/g" +wq

lub dos2unix utility.

Christy Wald
źródło
3

Możesz użyć następującego polecenia:
:%s/^V^M//g
gdzie „^” oznacza CTRLklawisz use .

JayG
źródło
2

polecenie poniżej służy do sformatowania wszystkich plików .sh w bieżącym katalogu, przetestowałem je na moim systemie operacyjnym Fedora.

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done
Maerlyn
źródło
2

W vimie wpisz:

:w !dos2unix %

Spowoduje to przesłanie zawartości bieżącego bufora do polecenia dos2unix i zapisanie wyników nad bieżącą zawartością. Vim poprosi o ponowne załadowanie pliku po

Tallak Tveide
źródło
2

Aby uruchomić bezpośrednio w konsoli Linux: vim file.txt +"set ff=unix" +wq

CBuzatu
źródło
1

Zwykle dos2unixmożesz użyć do tego polecenia, po prostu przeczytaj instrukcję, ponieważ wersje GNU i BSD różnią się tym, jak radzą sobie z argumentami.

Wersja BSD:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

Wersja GNU:

dos2unix $FILENAME

Możesz też utworzyć własną dos2unixz dowolną z proponowanych odpowiedzi tutaj, na przykład:

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}
dsm
źródło
1

Wiedziałem, że gdzieś to widziałem. Oto wskazówka dotycząca logowania do FreeBSD:

Chcesz usunąć wszystkie te ^ M znaków z pliku DOS? Próbować

tr -d \\r < dosfile > newfile
    -- Originally by Dru <[email protected]>
Albaro Pereyra
źródło
0

Chociaż ten temat jest bardzo stary, chciałbym umieścić inne rzeczy z Wikipedii:

%s/\r\+$//g

wypełniając znajdź wszystkie znaki powrotu karetki (jedno i więcej powtórzeń) do końca linii i usuń, więc \npozostaniesz na eol.

średnie obciążenie
źródło
0

To jest mój sposób. Otworzyłem plik w dos EOL i kiedy zapisuję plik, który automatycznie przekonwertuje na EOL unix

autocmd BufWrite * :set ff=unix
Thomas PABST
źródło
0

jeśli utworzysz plik w NotePad lub NotePad ++ w systemie Windows i przeniesiesz go do Linuksa i otworzysz przez vima, zobaczysz ^ M na końcu każdej linii. Aby to usunąć,

W terminalu Linux wpisz

dos2unix nazwa_pliku.ext

To zrobi wymaganą magię.

Santle Camilus
źródło
0

Chciałem nowego wiersza zamiast ^ M. Perl na ratunek:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

Lub napisać na standardowe wyjście:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
użytkownik3379574
źródło