W edytorze vim chcę zastąpić znak nowej linii (\ n) dwoma znakami nowej linii (\ n \ n), używając trybu polecenia vim.
Zawartość pliku wejściowego:
This is my first line.
This is second line.
Polecenie, które próbowałem:
:%s/\n/\n\n/g
zastępuje ciąg niechcianymi znakami jak
This is my first line.^@^@This is second line.^@^@
Następnie wypróbowałem następujące polecenie
:%s/\n/\r\r/g
Działa poprawnie. Czy możesz wyjaśnić, dlaczego działa dobrze z drugim poleceniem?
vim
regular-expression
vi-mode
Raghvendra
źródło
źródło
/
jako separatora. Jest to bardziej czytelne::%s;\n;\n\n;g
\n
, wymień\r\r
,:% s/\n/\r\r/g
: stackoverflow.com/a/71334/911945Odpowiedzi:
Co dziwne,
\n
w vimie zamiana nie oznacza nowej linii, ale zero. ASCII nul is^@
( control@).Historycznie, vi zastępuje
^M
( controlM) jako koniec linii, który jest nową linią. vim dodał rozszerzenie\r
(podobnie jak język C), aby oznaczać to samo co^M
, ale programiści postanowili nadać mu\n
wartość null podczas zamiany tekstu. Jest to niespójne z jego użyciem w wyszukiwaniu , które znajduje nowy wiersz.Dalsza lektura:
źródło
Spróbuj tego:
%s/$/^V^M/
(gdzie^V
jestCtrl-V
i^M
jestCtrl-M
- po wpisaniu^V
wypisuje^
znak, a następnie backspace nad nim, a po wpisaniu^M
pojawi się jako^M
... Ctrl-V jest standardowym dosłownym znakiem tty - uruchom polecenie,stty -a
aby pokaż znaki specjalne swojego tty).źródło
vim
służy\n
do reprezentowania znaku pustego\0
w pamięci, że sposóbvim
obsługi pliku zawiera znak pusty (chociażvi
nie może).Użycie
\n
w wyrażeniu tylko pasującego końca linii w buforze, a nie nowego wiersza w ciągu.Patrz : h NL-używany-dla-Null i : h CR-używany-dla-NL po więcej szczegółów.
źródło
Testowane z Neovim (
nvim
) iVim
wersjamiUsuń nowy wiersz:
Tutaj
\n
dopasowuje znaki nowej linii (aby wstawić nową linię, użyj\r
):Dodaj nowy wiersz:
Nie:
^@
jest znakiem diakrytycznym dla LF (wysuw wiersza; patrz http://vimhelp.appspot.com/digraph.txt.html#digraphs-default )Tak:
Aby odpowiedzieć na pytanie PO (jak zamienić jeden na
\n
dwa\n\n
), wystarczy dodać kolejne\r
:... tj. dopasuj oryginalny
\n
znak nowej linii ( ) i zastąp go dwoma znakami nowej linii / znaku powrotu karetki (\r\r
).źródło