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?



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:



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).


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.


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).


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.


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.


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.


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).


Bang on !! Działa na Macu.
shamail 10.10.17


15

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


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,


12

Zrobiłem to z sed:

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


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.


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

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.


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

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,

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/ .


5
sed s/^M//g file1.txt > file2.txt

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


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. :)


nigdy nie słyszałem o mac2unix, chciałbym jeszcze raz głosować, gdybym mógł!
Kuf

Huray! To jest odpowiednie rozwiązanie!
Prywatny



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>

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


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.


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'

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!


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.


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()

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.