vim pokazuje w każdej linii kończącej się ^ M
Jak mogę to zastąpić „normalnym” łamaniem linii?
vim pokazuje w każdej linii kończącej się ^ M
Jak mogę to zastąpić „normalnym” łamaniem linii?
Odpowiedzi:
To jedyna rzecz, która działała dla mnie:
: e ++ ff = dos
Znaleziono na: http://vim.wikia.com/wiki/File_format
:e ++ff=dos
następnie :set ff=unix
nastąpi konwersja zakończeń do rozsądnego formatu.
:%s/<Ctrl-V><Ctrl-M>/\r/g
Gdzie <Ctrl-V><Ctrl-M>
oznacza wpisz Ctrl+, Va następnie Ctrl+ M.
:%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).
:%s/<Ctrl-V><Ctrl-M>/\r/g
(gdzie \ r zastępuje ^ M znakiem nowej linii).
W systemach Linux i Mac OS następujące prace:
:%s/^V^M/^V^M/g
gdzie ^V^M
oznacza wpisz Ctrl+ V, a następnie Ctrl+ M.
Uwaga: w systemie Windows prawdopodobnie chcesz użyć ^Q
zamiast ^V
, ponieważ domyślnie ^V
jest mapowany do wklejania tekstu.
%s/\r/\r/g
działał dobrze w MacVimie dla pliku wyświetlanego tylko ^M
na końcu linii (jedna długa linia w kategoriach MacVim). Wyraźnie oznacza, że wzorzec różni się od części zamiennych tego polecenia.
Wewnątrz vim
spójrz na format pliku - DOS lub Unix:
:set filetype=unix
:set fileformat=unix
Plik zostanie zapisany bez znaków powrotu karetki (CR, ^ M).
set ff=unix
tak jak mały skrót w ten sam sposób, ft
co skrótfiletype
Plik, który utworzyłem za pomocą BBEdit w MacVimie, wyświetlał wiele ^M
zwrotó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.
\r
postacie, \n
mimo że określono je \r
jako zamiennik. Nie narzekam, właśnie tego chciałem. Po prostu dziwne.
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=dos
dodaniem „^ M ^ J” na końcu linii, ale odczytany flieformat=unix
tylko z usunięciem „^ J” z końca linii, pozostawiając tam „^ M”.
Wystarczy wpisać :e ++ff=dos
w wierszu poleceń Vima, aby zmienić format pliku z uniksowego na dos. To powinno rozwiązać problem. Jeśli nie, :%s/\r//g
powinien ci pomóc.
:e ++ff=dos
następnie :set ff=unix
i:w
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$//g
ale 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.
Ż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).
^ M jest pobierane przez Ctrl+ Vi Mtak samo
s/^M//g
Bez potrzeby używania Ctrl:
:%s/\r$//
Prosta rzecz, która zadziałała dla mnie
dos2unix filename
Zrobiłem to z sed:
sed -i -e 's/\r/\n/g' filename
sed -e 's/\r/\n/g' <<< 'over and over'
->oven and oven
sed
ale 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.
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.
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:
myfile
:e ++ff=dos
aby wymusić przeładowanie całego pliku jako zakończenia wiersza dos.:w ++ff=unix
aby zapisać plik przy użyciu zakończeń linii unixCtrl+ Mminimalizuje moje okno, ale Ctrl+ Enterfaktycznie wstawia ^M
znak. 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 .
Powyższe rozwiązanie doda dodatkową linię między istniejącymi liniami, ponieważ \r
po ^M
. Jest już niewidoczna .
Aby temu zapobiec, chcesz usunąć ^M
znaki bez ich zastępowania.
:%s/<Ctrl-V><Ctrl-Enter>//g
Gdzie %
oznacza „w tym buforze” s
oznacza „zamiennik”, /
oznacza „(znajdź) następujący wzór”, <Ctrl-V><Ctrl-Enter>
oznacza klawisze, które należy nacisnąć, aby uzyskać ^M
znak (patrz wyżej), //
oznacza „bez niczego” (lub „ze wzorem” między tymi dwoma ukośnikami, który jest pusty ”) i g
jest flagą oznaczającą„ globalnie ”, w przeciwieństwie do pierwszego wystąpienia w linii.
To działało dla mnie:
\n
koniec linii)Więc w vimie:
:set ff=unix
:w
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,
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/ .
sed s/^M//g file1.txt > file2.txt
gdzie ^ M jest wpisywane przez jednoczesne naciśnięcie 3 klawiszy, ctrl + v + m
Użyj jednego z następujących poleceń:
:%s/\r//g
Lub
:%s/\r\(\n\)/\1/g
To działało dla mnie:
:% s/\r\n/\r
Żadna z tych sugestii nie działała dla mnie, ponieważ udało mi się uzyskać ^M
mnó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
:g/^M/s// /g
Jeśli wpiszesz ^M
za pomocą Shift+6 Caps+M
, nie zaakceptuje.
Musisz wpisać ctrl+v ctrl+m
.
^M
daje niechciane podziały linii. Aby to obsłużyć, możemy użyć sed
polecenia w następujący sposób:
sed 's/\r//g'
Po prostu usuń set binary
w swoim .vimrc!
Aby użyć sed
w 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ą \r
jako znaków specjalnych. Cytując ciąg poleceń, nakazujesz $''
powłoce zastąpić \r
rzeczywistym \r
znakiem określonym w standardzie ANSI-C.
„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()
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