Jak przekonwertować podział ^ ^ na „normalny” podział w pliku otwartym w vimie?

481

vim pokazuje w każdej linii kończącej się ^ M

Jak mogę to zastąpić „normalnym” łamaniem linii?

ByteNirvana
źródło
3
Zmień rozwiązanie na zmianę formatu pliku, ponieważ jest to najbardziej czyste rozwiązanie.
erikbwork
1
Wiem, że to pytanie dotyczy vima, ale niektóre inne wyszukiwania Google również trafiają do tego wątku. Tak więc, jeśli masz zainstalowany Eclipse w swoim systemie, możesz przekonwertować ogranicznik wiersza dla pojedynczego pliku lub pełnego drzewa folderów plików za pomocą kilku kliknięć: stackoverflow.com/a/7019737/1364747
Teddy
Podoba mi się, jak nazywacie normalne podziały linii „normal” - w przeciwieństwie do tych ^ M
podziałów

Odpowiedzi:

134

To jedyna rzecz, która działała dla mnie:

: e ++ ff = dos

Znaleziono na: http://vim.wikia.com/wiki/File_format

Pam
źródło
Pracował na systemie Windows7 Vim7.4
schuess
19
:e ++ff=dosnastępnie :set ff=unixnastąpi konwersja zakończeń do rozsądnego formatu.
Mateen Ulhaq
Odpowiedź rozwiązania nie zadziałała, pomogły mi tylko polecenia @MateenUlhaq.
Edenshaw
577

Komenda

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

Gdzie <Ctrl-V><Ctrl-M>oznacza wpisz Ctrl+, Va następnie Ctrl+ M.

Wyjaśnienie

:%s

zamiennik,% = wszystkie linie

<Ctrl-V><Ctrl-M>

Znaki ^ M (Ctrl-V jest sposobem Vima na pisanie znaku Ctrl ^, a Ctrl-M zapisuje M po wyrażeniu regularnym, co powoduje powstanie znaku specjalnego ^ M)

/\r/

z nową linią ( \r)

g

I rób to globalnie (nie tylko pierwsze wystąpienie na linii).

LeopardSkinPillBoxHat
źródło
21
usunął znaki ^ M, ale nie wstawił znaku powrotu karetki.
luckytaxi
14
@ jumpnett - Musisz nacisnąć akordy klawiszowe Ctrl-V / Ctrl-M, nie wpisując tego jako dosłowny tekst.
LeopardSkinPillBoxHat
33
Jest to zdecydowanie odpowiednia odpowiedź na pytanie, jeśli masz ^ M, po którym następuje nowa linia, chcesz zachować nową linię, ale usunąć ^ M. Wykonując inne podstawienia poniżej podwójnego spacji w pliku.
dlamblin
12
Jeśli nadal brakuje znaku powrotu karetki (tzn. ^ M został usunięty, ale wszystko jest owinięte w jednym wierszu), wykonaj: :%s/<Ctrl-V><Ctrl-M>/\r/g(gdzie \ r zastępuje ^ M znakiem nowej linii).
William Turrell,
7
Jeśli korzystasz z Vima w systemie Windows, musisz użyć <Ctrl-Q> zamiast <Ctrl-V>.
GrandAdmiral
418

W systemach Linux i Mac OS następujące prace:

:%s/^V^M/^V^M/g

gdzie ^V^Moznacza wpisz Ctrl+ V, a następnie Ctrl+ M.

Uwaga: w systemie Windows prawdopodobnie chcesz użyć ^Qzamiast ^V, ponieważ domyślnie ^Vjest mapowany do wklejania tekstu.

Paul Tomblin
źródło
3
Dlaczego otrzymało to głosowanie negatywne? Działa, nawet jeśli plik jest zmiksowany w jednej linii, ponieważ ma niewłaściwy koniec linii.
Paul Tomblin
2
Nie. Mój sposób zastępuje dowolny koniec linii w pliku prawidłowym końcem linii.
Paul Tomblin
7
Jest to inny problem, gdy w twoim pliku NIE ma żadnych nowych wierszy, co, przyznaję, jest bardziej powszechne. Do FYI ^ M można dopasować: \ r
dlamblin
12
To głęboko tajemnicze polecenie, ale działa na mnie na komputerze Mac.
Eric Walker,
5
Stwierdziłem, że odpowiednik %s/\r/\r/gdziałał dobrze w MacVimie dla pliku wyświetlanego tylko ^Mna końcu linii (jedna długa linia w kategoriach MacVim). Wyraźnie oznacza, że ​​wzorzec różni się od części zamiennych tego polecenia.
RichVel
184

Wewnątrz vimspójrz na format pliku - DOS lub Unix:

:set filetype=unix

:set fileformat=unix

Plik zostanie zapisany bez znaków powrotu karetki (CR, ^ M).

Jonathan Leffler
źródło
3
use: set fileformat = unix W większości konfiguracji typ pliku zmienia tylko używany typ składni.
derGral
6
To naprawiło błąd, który miałem ... Vim zaczął myśleć, że moim plikiem w formacie UNIX są okna i nowo zmienione linie pokazywały ^ M w git diff.
Thomas Hunter II
Musi być zależny od systemu. Dzisiaj ten zadziałał. Komenda set jest wykonywana w vim, btw.
gbarry
1
świetnie! ponieważ
format pliku
3
Działa to również na vi BTW, i możesz zrobić set ff=unixtak jak mały skrót w ten sam sposób, ftco skrótfiletype
Posva
110

Plik, który utworzyłem za pomocą BBEdit w MacVimie, wyświetlał wiele ^Mzwrotów wierszy zamiast zwykłych. Poniższy ciąg zastępujący rozwiązał problem - mam nadzieję, że to pomoże:

:%s/\r/\r/g

Jest to interesujące, ponieważ zastępuję podziały wiersza tym samym znakiem, ale przypuszczam, że Vim musi tylko uzyskać nowy, aby wyświetlać poprawnie. Byłbym zainteresowany, aby poznać mechanikę tego, dlaczego to działa.

netpoetica
źródło
1
Funkcje wyszukiwania mają tendencję do akceptowania szerszych zasad rozpoznawania sekwencji końca linii. Ale ma określone znaczenie, gdy jest zapisywane jako dane.
gbarry
To działało dla mnie w gVimie Windowsa, aby uporządkować plik, który nie miał podziałów linii, zamiast tego dużo ^ M.
flash
2
Ze wszystkich rozwiązań oferowanych na tej stronie był to jedyny wzór, który działał dla mnie przy usuwaniu ^ M z pliku csv. Korzystanie z MacVim.
B6431
+1 Pracowałem również dla mnie, gdy SSHing do Ubuntu Trusty z Windows za pomocą Mobaterm
Carl
Wydawało się, że zastąpiło to wszystkie \rpostacie, \nmimo że określono je \rjako zamiennik. Nie narzekam, właśnie tego chciałem. Po prostu dziwne.
pączki
34

Najpierw użyj, :set ff?aby ustalić format pliku.

Myślę, że może tak być unix, problem polega na tym, że plik został utworzony z fileformat=dosdodaniem „^ M ^ J” na końcu linii, ale odczytany flieformat=unixtylko z usunięciem „^ J” z końca linii, pozostawiając tam „^ M”.

Wystarczy wpisać :e ++ff=dosw wierszu poleceń Vima, aby zmienić format pliku z uniksowego na dos. To powinno rozwiązać problem. Jeśli nie, :%s/\r//gpowinien ci pomóc.

chenxsan
źródło
3
Musiałem zrobić jedno i drugie. :e ++ff=dosnastępnie :set ff=unixi:w
Max
29

aby dopasować znak ^ M, musiałem go wizualnie zaznaczyć, a następnie użyć polecenia Kopiuj do schowka, aby go odzyskać. Możesz to przetestować, szukając znaku przed wypróbowaniem polecenia zamiany.

/^M

powinien wybrać pierwszą złą linię

:%s/^M/\r/g

zastąpi wszystkie błędne ^ M zwrotami karetki.

Działa to w MacVimie, który jest oparty na gvim 7.

EDYTOWAĆ:

Mam ten problem ponownie na moim komputerze z systemem Windows 10, który ma Ubuntu dla Windows, i myślę, że to powoduje problemy z formatem plików dla vima. W tym przypadku zmiana ff na unix, mac lub dos nie zrobiła nic poza zmianą ^ M na ^ J iz powrotem.

Rozwiązanie w tym przypadku:

:%s/\r$/ /g
:%s/ $//g

Powodem, dla którego wybrałem tę trasę, jest to, że chciałem upewnić się, że nie niszczę mojego pliku. Mógłbym, :%s/\r$//gale to natychmiast usunęłoby zwroty karetki i mógłbym mieć nieoczekiwane wyniki. Zamiast tego przekształcamy pojedynczy znak CR, tutaj znak ^ M, w spację, a następnie usuwamy wszystkie spacje na końcu linii (co dla mnie jest pożądanym rezultatem niezależnie)

Przepraszam, że ożywiłem stare pytanie, na które już dawno udzielono odpowiedzi, ale wydawało się, że pojawiło się pewne zamieszanie i pomyślałem, że pomogę wyjaśnić niektóre z nich, ponieważ pojawia się wysoko w wyszukiwarkach Google.

Metagrapher
źródło
1
naciśnięcie ctrl-v ctrl-m może również działać w celu wstawienia znaku, a także fwiw. ale \ r jest tym, co wstawia prawidłowy znak powrotu karetki.
Metagrapher,
1
To jest PRAWA odpowiedź. Jak powiedziano powyżej, użyj <ctrl-v> <ctrl-m>, aby wstawić dosłowne ^ M do polecenia.
carlosayam
1
Zgadzam się, choć jestem pewien, że gdyby to zadziałało dla mnie w momencie oryginalnego publikowania, nie napisałbym tego. ;)
Metagrapher,
22

Żadne z tych nie działało dla mnie, więc wypróbowałem to, co zadziałało:

rodzaj :%s/

naciśnij CTRL-VCTRL-M

rodzaj //g

naciśnij Enter

Tak więc powinno wyglądać ogólne polecenie Vima :%s/^M//g

Co to robi: :%s(znajdź i zamień) /^M/(ten symbol) /(bez znaków) g(globalnie).

d -_- b
źródło
Bang on !! Działa na Macu.
shamail 10.10.17
17

^ M jest pobierane przez Ctrl+ Vi Mtak samo

s/^M//g
Andrew Sledge
źródło
15

Bez potrzeby używania Ctrl: :%s/\r$//

BHarman
źródło
1
Tak też to robię. Po prostu nigdy nie pamiętam polecenia
piksel 67
Jest to zalecany sposób na usunięcie tych zakończeń.
Metagrapher,
13

Prosta rzecz, która zadziałała dla mnie

dos2unix   filename
Shahzeb Khan
źródło
12

Zrobiłem to z sed:

sed -i -e 's/\r/\n/g' filename

Freedom_Ben
źródło
Jesteś pewien, że to działa? W systemie OSX: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand
Tak, działa (często go używam), ale w OSX, jeśli nie masz zainstalowanej wersji GNU sed, może nie działać. Wersja sed dostarczana domyślnie przez Apple jest znacznie inna (niestety) niż wersja GNU, która jest dostarczana na wszystkich dystrybucjach Linuksa. Aby uzyskać dodatkową pomoc, sprawdź odpowiedź na to pytanie: stackoverflow.com/q/30003570/2062384
Freedom_Ben
Dzięki @Freedom_Ben. Wygląda więc na to, że działa to dla GNU, sedale nie dla BSD sed(jak w OSX). Każdy, kto naprawia łamanie linii, prawdopodobnie działa z wieloma systemami operacyjnymi, więc warto wyjaśnić, kiedy odpowiedź zadziała.
Armand,
10

A co z tym, że :%s/\r//g to dla mnie całkowicie działało.

To po prostu czyści koniec linii wszystkich linii, usuwa ^ M i to wszystko.

tonatiuhnb
źródło
9

Istnieje wiele innych odpowiedzi na to pytanie, ale poniższe są dla mnie najlepsze, ponieważ potrzebowałem rozwiązania z linii poleceń:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

Wyjaśnienie:

  • Bez ładowania plików .vimrc otwórz myfile
  • Uruchom, :e ++ff=dosaby wymusić przeładowanie całego pliku jako zakończenia wiersza dos.
  • Uruchom, :w ++ff=unixaby zapisać plik przy użyciu zakończeń linii unix
  • Zamknij vim
Micah Smith
źródło
3
Dziękuję Ci! to naprawiło mój problem i uznało, że warto go używać w skryptach
Peddipaga,
8

Ctrl+ Mminimalizuje moje okno, ale Ctrl+ Enterfaktycznie wstawia ^Mznak. Musiałem też upewnić się, że nie zdejmę Ctrlklucza między prasami.

Tak więc dla mnie rozwiązaniem było:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

Gdzie <Ctrl-V><Ctrl-Enter>oznacza nacisnąć i przytrzymać Ctrl , nacisnąć i zwolnić V, nacisnąć i zwolnić Enter, a następnie zwolnić Ctrl .

Jeśli pracujesz nad plikiem wygenerowanym przez system Windows

Powyższe rozwiązanie doda dodatkową linię między istniejącymi liniami, ponieważ \rpo ^M. Jest już niewidoczna .

Aby temu zapobiec, chcesz usunąć ^Mznaki bez ich zastępowania.

:%s/<Ctrl-V><Ctrl-Enter>//g

Gdzie %oznacza „w tym buforze” soznacza „zamiennik”, /oznacza „(znajdź) następujący wzór”, <Ctrl-V><Ctrl-Enter>oznacza klawisze, które należy nacisnąć, aby uzyskać ^Mznak (patrz wyżej), //oznacza „bez niczego” (lub „ze wzorem” między tymi dwoma ukośnikami, który jest pusty ”) i gjest flagą oznaczającą„ globalnie ”, w przeciwieństwie do pierwszego wystąpienia w linii.

CrannDarach
źródło
7

To działało dla mnie:

  1. Ustaw format pliku na unix ( \nkoniec linii)
  2. Zapisz plik

Więc w vimie:

:set ff=unix
:w
Stryker
źródło
1
Ten zadziałał dla mnie, a zaakceptowana odpowiedź nie.
Marcello Romani
7

W moim przypadku,

Nic powyżej nie działało, miałem plik CSV skopiowany na maszynę z systemem Linux z mojego komputera Mac i użyłem wszystkich powyższych poleceń, ale nic nie pomogło poza tym poniżej

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

Miałem plik, w którym ^ M znaki były przełączane między wierszami coś w stylu poniżej

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
Vishwanath gowda k
źródło
5

Alternatywnie dostępne są narzędzia typu open source o nazwie dos2unix i unix2dos, które robią to samo. W systemie Linux są one prawdopodobnie instalowane domyślnie; w przypadku systemu Windows można je pobrać między innymi z http://www.bastet.com/ .

ConcernedOfTunbridgeWells
źródło
5
sed s/^M//g file1.txt > file2.txt

gdzie ^ M jest wpisywane przez jednoczesne naciśnięcie 3 klawiszy, ctrl + v + m

Niebieski diament
źródło
4

użyj narzędzia dos2unix, jeśli plik został utworzony w systemie Windows, użyj narzędzia mac2unix, jeśli plik został utworzony w systemie Mac. :)

Ramesh
źródło
nigdy nie słyszałem o mac2unix, chciałbym jeszcze raz głosować, gdybym mógł!
Kuf
Huray! To jest odpowiednie rozwiązanie!
Prywatny
3

Użyj jednego z następujących poleceń:

:%s/\r//g

Lub

:%s/\r\(\n\)/\1/g
Muhammad Reda
źródło
2

To działało dla mnie:

:% s/\r\n/\r
ContextSwitch
źródło
1

Aby zapisać naciśnięcia klawiszy , możesz uniknąć pisania Ctrl+ VCtrl+ M, umieszczając to w odwzorowaniu. Po prostu otwórz plik zawierający znak ^ M, pociągnij go i wklej do linii takiej jak ta w .vimrc:

nnoremap <Leader>d :%s/^M//g<CR>
agouge
źródło
1

Żadna z tych sugestii nie działała dla mnie, ponieważ udało mi się uzyskać ^Mmnóstwo podziałów linii podczas pracy zarówno z vimem, jak i zaćmieniem. Podejrzewam, że spotkałem się ze sprawą zewnętrzną, ale na wypadek, gdyby to pomogło każdemu, kto to zrobił.

:%s/.$//g

I rozwiązało to mój problem

rogermushroom
źródło
Spowoduje to usunięcie DOWOLNEGO znaku na końcu linii. Jeśli masz linię, która z jakiegoś powodu nie jest zakończona ^ M, usuniesz także ten znak i byłoby to nieoczekiwane. Nie powinno tak być, ale jeśli tak jest, a ty o tym nie wiesz, możesz bardzo mocno zidentyfikować swój plik.
Metagrapher,
1
:g/^M/s// /g

Jeśli wpiszesz ^Mza pomocą Shift+6 Caps+M, nie zaakceptuje.

Musisz wpisać ctrl+v ctrl+m.

Shravan Kumar
źródło
1

^Mdaje niechciane podziały linii. Aby to obsłużyć, możemy użyć sedpolecenia w następujący sposób:

sed 's/\r//g'
Manoj Kumar
źródło
idk, dlaczego zostało to obniżone do -1 ... ponieważ używa sed? możesz dokonać tego samego podstawienia w vimie i powinno działać
Metagrapher 11.09.17
1

Po prostu usuń set binaryw swoim .vimrc!

falcucci
źródło
W innym wątku zalecono „set binary”, aby pozbyć się automatycznego wstawiania nowej linii.
dexter2305
1

Aby użyć sedw systemie MacOS, wykonaj następujące czynności:

sed -i.bak $'s/\r//' <filename>

Objaśnienie:$'STRING' składnia tutaj odnosi się do powłoki bash. Komputery Mac nie traktują \rjako znaków specjalnych. Cytując ciąg poleceń, nakazujesz $''powłoce zastąpić \rrzeczywistym \rznakiem określonym w standardzie ANSI-C.

Nitin Nain
źródło
0

„Ta funkcja zachowuje listę skoków

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()
SergioAraujo
źródło
W takim przypadku, co jest nie tak z używaniem natywnej komendy dos2unix * NIX? linux.die.net/man/1/dos2unix
Metagrapher
0

Spędziłem popołudnie walcząc z \ n ctrl-v 012 (oba dostarczają mi null). i pracowałem przez ten wątek, aż dotarłem do metagraphera.

\r działało dobrze dla mnie!

/),/s/),/)\r/g

zwrócił się tak:

czarna lista dodatkowa: i386 (0.4.1, 0.4.1 + nmu1), libmount1: i386 (2.20.1-5.1, 2.20.1-5.2), libblkid1: i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12: i386 (0.9.7.4, 0.9.7.5), nmap: i386 (6.00-0.1, 6.00-0.2), libsane-wspólne: i386 (1.0.22-7.3,

w coś takiego:

26 libwv-1.2-4: i386 (1.2.9-3, automatyczny)
27 openjdk-6-jre-headless: i386 (6b24-1.11.4-3, automatyczny)
28 jed: i386 (0.99.19-2.1)

Magia. Jestem głęboko wdzięczny

użytkownik1997684
źródło