Jak zastąpić znak znakiem nowej linii w Vimie?

Próbuję zastąpić każdy , w bieżącym pliku nową linią:

:%s/,/\n/g 

Ale wstawia to, co wygląda jak ^@ zamiast rzeczywistego nowego wiersza. Plik nie jest w trybie DOS.

Co mam zrobić? Jeśli jesteś ciekawy, tak jak ja, sprawdź pytanie dlaczego \r jest nową linią dla Vima? też.
Author: Robert Harvey, 2008-09-16

11 answers

Użyj \r zamiast \n.

Zastąpienie przez \n wstawia znak null do tekstu. Aby uzyskać nowy wiersz, użyj \r. Gdy poszukujesz nowej linii, nadal używasz \n. Asymetria ta wynika z faktu, że \n i \r zrób trochę inne rzeczy :

\n dopasowuje koniec linii (newline), podczas gdy \r dopasowuje powrót karetki. Z drugiej strony, w podstawieniach \n wstawia znak null, podczas gdy \r wstawia newline (dokładniej, jest traktowany jako wejście ). Oto mały, nieinteraktywny przykład, aby to zilustrować, używając funkcji wiersza poleceń Vima(innymi słowy, możesz skopiować i wkleić następujące elementy do terminala, aby je uruchomić). xxd pokazuje zrzut heksowy pliku wynikowego.

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

Innymi słowy, \n wstawił bajt 0x00 do tekstu; \r wstawił bajt 0x0A.

 2134
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-11 21:01:25

Oto sztuczka:

Najpierw ustaw sesję vi (m), aby umożliwić dopasowanie wzorca ze znakami specjalnymi(np. Pewnie warto włożyć tę linkę do swojego .vimrc lub .plik exrc.

:set magic

Następny, do:

:s/,/,^M/g

Aby uzyskać znak ^M, wpisz Control-v i wciśnij Enter . Pod Windows, do Control-q, Wpisz . Jedyny sposób, w jaki mogę je zapamiętać, to przypomnienie sobie, jak mało mają sensu.:

A: jaki znak kontrolny byłby najgorszy do reprezentowania nowej linii?

B: albo q (ponieważ zwykle oznacza "Zakończ") albo v ponieważ tak łatwo byłoby wpisać kontrolę-c przez pomyłkę i zabić redaktora.

A: niech tak będzie.

 167
Author: Logan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-27 18:31:21

W składni s/foo/bar \r i \n mają różne znaczenia, w zależności od kontekstu.


Krótki:

Dla foo:
\N = newline (LF na Linuksie/mac, CRLF na windows)
\r = carriage return (CR)

Dla bar:
\r = is newline
\N = null bajt.

Dłuższe: (z liczbami ascii)

NUL = 0x00 = 0 = CTRL@
LF = 0x0A = 10 = CTRLJ
CR = 0x0D = 13 = CTRLM

Oto lista znaków sterujących ASCII , wstaw je w vim poprzez CTRLvCTRL---klucz - - - .
W bash lub innych powłokach unix/linux wpisz CTRL---klucz - - - . Try CTRLM w bash jest to to samo co wciśnięcie ENTER, ponieważ powłoka zdaje sobie sprawę z tego, co ma na myśli, mimo że systemy linuksowe używają kanałów linii do rozgraniczania linii.

To wstawianie literałów w bash, poprzedzanie ich CTRLv również zadziała.

Spróbuj w bash:

echo ^[[33;1mcolored.^[[0mnot colored.

Używa sekwencji escape ANSI, wstawia dwa ^[ za pomocą CTRLvESC .

Możesz również spróbować CTRLvCTRLnawpisz , co da ci to:

bash: $'\r': command not found

Pamiętasz \r z góry? :>

This ASCII control lista znaków różni się od pełnej tabeli symboli ASCII tym, że znaki sterujące, które są wstawiane do konsoli/pseudoterminalu/Vima za pomocą klawisza CTRL (haha), można tam znaleźć. Natomiast w języku C i większości innych języków zwykle używa się kodów ósemkowych do reprezentowania tych "znaków".

Jeśli naprawdę chcesz wiedzieć, skąd to wszystko się bierze: http://www.linusakesson.net/programming/tty/.
To jest najlepszy link, który przyjdzie na ten temat, ale uważaj: są smoki.


TL; DR

Zwykle foo = \n, oraz bar = \r.

 70
Author: sjas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-02 19:16:36

Musisz użyć

:%s/,/^M/g

Aby uzyskać znak ^M, Naciśnij Ctrl v po którym następuje Wpisz

 45
Author: dogbane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-04 20:00:08

\r mogę tu pracować za Ciebie.

 28
Author: Lasar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 15:48:15

Z Vimem w Windows użyj Ctrl+Q zamiast Ctrl+V

 20
Author: grantc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-11 10:17:23

Z eclipse, znaki ^M mogą być osadzone w linii i chcesz je przekonwertować na nowe linie.

:s/\r/\r/g
 8
Author: rickfoosusa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-19 20:25:12

Ale jeśli ktoś musi zastąpić, to następujące rzeczy działają

:%s/\n/\r\|\-\r/g

W powyższym przykładzie każdy następny wiersz jest zastępowany następnym wierszem, a następnie / - i ponownie następnym wierszem. Jest to używane w tabelach wiki. jeżeli tekst jest następujący:

line1
line2
line3

Zmienia się na

line1
|-
line2
|-
line3
 5
Author: Kiran Telukunta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-07 08:09:42

To najlepsza odpowiedź na to, co myślę, ale byłoby ładniej w tabeli: https://stackoverflow.com/a/12389839/962394 .

Przeformułowanie:

Musisz użyć \r, Aby użyć kanału liniowego (ascii 0x0a, nowej linii Uniksa) w zastępstwie regex, ale jest to charakterystyczne dla tego zamiennika - powinieneś normalnie oczekiwać używania \n dla kanału liniowego i \r dla powrotu karetki.

To dlatego, że vim użył \n w zastępstwie, aby oznaczać Znak NIL (ascii 0x00). Można było się spodziewać, że NIL będzie \0 zamiast tego, uwalniając \n do zwykłego użytku dla linii, ale \0 ma już znaczenie w zastępstwach regex, więc zostało przeniesione na \n. Stąd idąc dalej, również przesuń znak nowego wiersza z \n na \r (który we wzorze regex jest znakiem powrotu karetki, ascii 0x0d).

character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          | \n
line feed (unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

NB: ^M (Ctrl-V Ctrl-M w Linuksie) wstawia nowy wiersz, gdy jest używany w zastępstwie regex zamiast powrotu karetki jak inni radzili(po prostu próbowałem).

Zauważ również, że vim przetłumaczy znak linii, gdy zapisze do pliku na podstawie ustawień formatu pliku, co może zdezorientować sprawę.

 5
Author: codeshot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:31

Jeśli potrzebujesz zrobić dla całego pliku, zasugerowano mi również, że możesz spróbować z linii poleceń

sed 's/\\n/\n/g' file > newfile
 4
Author: Evan Donovan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-09 23:01:29

Oto odpowiedź, która mi pomogła. Od tego faceta

- - - - cytowanie http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


Coś jeszcze muszę zrobić i nie pamiętam, a potem muszę spojrzeć w górę.

W vi aby wstawić znak nowej linii w wyszukiwaniu i zastępowaniu, wykonaj następujące czynności:

:%s/look_for / replace_with^M / g powyższe polecenie zamieniłoby wszystkie instancje " look_for "na" replace_with\n " (z \N oznacza newline)

Aby uzyskać "^m", wprowadź kombinację klawiszy "ctl-V", a następnie (zwolnij wszystkie klawisze) naciśnij klawisz "enter".


 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-03 19:31:15