Próbuję zastąpić każdy ,
w bieżącym pliku nowym wierszem:
:%s/,/\n/g
Ale wstawia coś, co wygląda jak ^@
rzeczywista nowa linia. Plik nie jest w trybie DOS ani nic takiego.
Co powinienem zrobić?
Jeśli jesteś ciekawy, tak jak ja, sprawdź pytanie: Dlaczego jest nowy wiersz dla Vima? także.
Odpowiedzi:
Użyj
\r
zamiast\n
.Zastąpienie przez
\n
wstawia znak pusty w tekście. Aby uzyskać nowy wiersz, użyj\r
. Jednak podczas wyszukiwania nowego wiersza nadal będziesz używać\n
. Ta asymetria wynika z faktu, że\n
i\r
robią nieco inne rzeczy :\n
dopasowuje koniec linii (nowa linia), natomiast\r
dopasowuje znak powrotu karetki. Z drugiej strony, w podstawieniach\n
wstawia znak zerowy, a\r
wstawia znak nowej linii (a dokładniej, jest traktowany jako dane wejściowe <CR>). Oto mały, nieinteraktywny przykład, aby to zilustrować, przy użyciu funkcji wiersza polecenia Vima (innymi słowy, możesz skopiować i wkleić poniższe w terminalu, aby go uruchomić).xxd
pokazuje zrzut heksowy wynikowego pliku.Innymi słowy,
\n
wstawił bajt 0x00 do tekstu;\r
wstawił bajt 0x0a.źródło
\r
nie działa w ten sposób. Ale możesz naciskaćCtrl-V
Enter
zamiast pisać\r
i to działa.\r
wstawia<CR>
i\n
wstawia wartość zerową, w jaki sposób miałbym zastąpić coś znakiem powrotu karetki?Oto sztuczka:
Najpierw ustaw swoją sesję Vi (m), aby umożliwić dopasowanie wzorca ze znakami specjalnymi (np. Nowa linia). Prawdopodobnie warto umieścić tę linię w pliku .vimrc lub .exrc:
Następnie wykonaj:
Aby zdobyć
^M
postać, wpisz Ctrl+ Vi naciśnij Enter. Pod Windows, wykonaj Ctrl+ Q, Enter. Jedyny sposób, w jaki mogę je zapamiętać, to zapamiętanie, jak mało mają sensu:źródło
:set magic
(nie ma go w moim ~ / _vimrc), anictrl-q
. Wystarczy proste,ctrl-v
a następnie Enter tworzy^M
dla mnie postać w porządku.Ctrl-C
tak naprawdę nie zabija edytora, chociaż może anulować powrót do trybu normalnego.Ctrl-V
oznacza dosłownie iCtrl-Q
oznacza, że ktoś popełnił błąd podczas ładowania$VIMRUNTIME/mswin.vim
pliku konfiguracyjnego. Nie potrzebujesz MSWIN. Zamiast tego użyj własnego vimrc.sed -n l
tej pory. Dobrze wiedzieć, że to samo można osiągnąć za pomocąCtrl-v
in vim.W składni
s/foo/bar
,\r
i\n
mają różne znaczenie w zależności od kontekstu.Krótki:
Dla
foo
:\ n = nowa linia (LF w systemie Linux / Mac, CR + LF w systemie Windows)
\ r = powrót karetki (CR)
Dla
bar
:\ r = jest znakiem nowej linii
\ n = bajt zerowy.
Dłuższy (z numerami ASCII):
NUL
= 0x00 = 0 = Ctrl+ @LF
= 0x0A = 10 = Ctrl+ JCR
= 0x0D = 13 = Ctrl+MOto lista znaków kontrolnych ASCII . Wstaw je do Vima za pomocą Ctrl+ V, Ctrl+ ---key---.
W Bash lub innych powłokach Unix / Linux po prostu wpisz Ctrl+ ---key---.
Spróbuj Ctrl+ Mw Bash. Jest to to samo, co uderzenie Enter, ponieważ powłoka zdaje sobie sprawę z tego, co ma na myśli, nawet jeśli systemy Linux używają kanałów do rozdzielania linii.
Aby wstawić literały w bash, dodanie ich za pomocą Ctrl+ Vrównież będzie działać.
Wypróbuj w Bash:
Wykorzystuje sekwencje specjalne ANSI . Włóż dwa
^[
„s poprzez Ctrl+ V, Esc.Można także spróbować Ctrl+ V, Ctrl+ M, Enter, który pozwoli Ci dać w ten sposób:
Pamiętasz
\r
z góry? :>Ta lista znaków kontrolnych ASCII różni się od kompletnej tablicy symboli ASCII tym , że można tam znaleźć znaki kontrolne, które są wstawiane do konsoli / pseudoterminalu / Vima za pomocą Ctrlklucza (haha).
Podczas gdy w C i większości innych języków zwykle używasz kodów ósemkowych do reprezentowania tych „znaków”.
Jeśli naprawdę chcesz wiedzieć, skąd to wszystko się bierze: TTY odszyfrowane . To jest najlepszy link do tego tematu, ale uważaj: są smoki.
TL; DR
Zwykle
foo
=\n
ibar
=\r
.źródło
:s/x/^M/g
powinien zrobić. Wstaw^M
via,ctrl-v
a następniectrl-m
.Musisz użyć:
Aby uzyskać
^M
postać, naciśnij Ctrl+, va następnie Enter.źródło
\r
mogę wykonać tutaj pracę dla ciebie.źródło
W Vimie na Windows użyj Ctrl+ Qzamiast Ctrl+ V.
źródło
To najlepsza odpowiedź dla mojego sposobu myślenia, ale byłaby ładniejsza w tabeli:
Dlaczego nowa linia dla Vima?
Przeredagowanie:
Musisz użyć,
\r
aby użyć przejścia do wiersza (ASCII0x0A
, nowa linia uniksowa) w zamianie wyrażenia regularnego, ale jest to specyficzne dla zamiany - zwykle powinieneś nadal oczekiwać, że użyjesz go\n
do przesunięcia wiersza i\r
powrotu karetki.Wynika to z tego, że Vim używał
\n
zamiennika w znaczeniu znaku NIL (ASCII0x00
). Być może spodziewałeś się, że NIL był\0
zamiast tego, zwalniając go\n
do zwykłego użycia do wstawiania wiersza, ale\0
już ma znaczenie w zastępowaniu wyrażeń regularnych, więc został przesunięty do\n
. Stąd dalej idzie również przesunięcie nowej linii z\n
na\r
(która we wzorcu wyrażenia regularnego jest znakiem powrotu karetki, ASCII0x0D
).Uwaga:
^M
( Ctrl+ V Ctrl+ Mw systemie Linux) wstawia nowy wiersz, gdy jest używany w zamianie wyrażenia regularnego, zamiast powrotu karetki, jak zalecili inni (właśnie tego próbowałem).Zauważ też, że Vim przetłumaczy znak przesunięcia wiersza, gdy zapisuje do pliku na podstawie ustawień formatu pliku, co może mylić sprawy.
źródło
Z Eclipse
^M
znaki mogą być osadzone w linii i chcesz je przekształcić w znaki nowej linii.źródło
Ale jeśli trzeba zastąpić, to działa następująca rzecz:
W powyższym, każda następna linia jest zastępowana następną linią, a następnie
|-
raz za razem nową linią. Jest to używane w tabelach wiki.Jeśli tekst jest następujący:
Zmienia się na
źródło
Jeśli musisz to zrobić dla całego pliku, zasugerowano mi również, że możesz spróbować z wiersza poleceń:
źródło
printf 'foo\\nbar\n' | sed 's/\\n/\n/g'
sprawdzić, czy zadziała w twoim systemie. (Podziękowania dla dobrych ludzi z #bash na freenode za tę sugestię).Oto odpowiedź, która zadziałała dla mnie. Od tego faceta:
---- cytowanie Użyj edytora vi, aby wstawić znak nowej linii w miejsce zamiany
Coś jeszcze muszę zrobić i nie mogę sobie przypomnieć, a potem muszę podnieść wzrok.
W vi, aby wstawić znak nowej linii do wyszukiwania i zamień, wykonaj następujące czynności:
Powyższe polecenie zastąpiłoby wszystkie wystąpienia „look_for” na „replace_with \ n” (z \ n oznacza nowy wiersz).
Aby uzyskać „^ M”, wprowadź kombinację klawiszy Ctrl+ V, a następnie (zwolnij wszystkie klawisze) naciśnij Enterklawisz.
źródło