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: Peter Mortensen, 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 CR ). 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.

 2727
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
2020-08-31 13:48:59

Oto sztuczka:

Najpierw ustaw sesję Vi (m), aby umożliwić dopasowanie wzorca ze znakami specjalnymi (np.: newline). 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 Ctrl + V i wciśnij Enter . W systemie Windows wykonaj Ctrl + Q, Wpisz . Jedyny sposób, w jaki mogę je zapamiętać, to przypomnienie sobie, jak mało sensowne są Marka:

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ć Ctrl + C przez pomyłkę i zabić redaktora.

A: niech tak będzie.

 219
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
2020-06-20 09:12:55

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


Krótki:

Dla foo:

\r == "Powrót powozu" (CR / ^M)
\n == dopasowanie " line feed "(LF) na Linuksie/Macu i CRLF na Windows

Dla bar:

\r == produkuje {[10] } na Linuksie / Mac, CRLF na Windows
\n == "bajt null" (NUL / ^@)

Podczas edycji plików w Linuksie (np. na serwerze WWW) FTP/SFTP) - wszystkie ^M ' S, które widzisz w Vimie, to CR'S, których linux nie tłumaczy, ponieważ używa tylko LF' s, aby przedstawić podział linii.


Dłuższe (z numerami ASCII):

NUL = = 0x00 == 0 == Ctrl + @ == ^@ pokazane w vim
LF == 0x0A == 10 == Ctrl + J
CR == 0x0D == 13 == Ctrl + Na == ^M pokazane w vim

Oto lista znaków sterujących ASCII . Wstaw je do Vima za pomocą Ctrl + V,Ctrl + ---klucz - - - .

W Bash lub innych powłokach Uniksa/Linuksa po prostu wpisz Ctrl + ---klucz - - - .

Spróbuj Ctrl + M {[59] } W Bash. Jest to to samo co wciśnięcie Enter, ponieważ powłoka zdaje sobie sprawę, 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 Ctrl + V również zadziała.

Spróbuj w Bash:

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

To wykorzystuje sekwencje ucieczki ANSI . Wstaw dwa ^[ za pomocą Ctrl + V, Esc .

Możesz również spróbować Ctrl + V,Ctrl + Na, wpisz , 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źć.

Podczas gdy 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: TTY demystified. To jest najlepszy link, z którym się natkniesz o tym temacie, ale uważaj: są smoki.


TL; DR

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

 102
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
2020-07-31 08:59:06

Musisz użyć:

:%s/,/^M/g

Aby uzyskać znak ^M, Naciśnij Ctrl + v, po którym następuje Wprowadź .

 58
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
2019-11-15 09:52:50

\r mogę tu pracować za Ciebie.

 43
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

W Vimie w Windows użyj Ctrl + Q zamiast Ctrl + V .

 25
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
2019-11-15 09:53:45

To jest najlepsza odpowiedź na to, co myślę, ale byłoby ładniej w tabeli:

dlaczego \r jest nową linią dla Vima?

Przeformułowanie:

Musisz użyć \r, Aby użyć kanału liniowego (ASCII 0x0A, nowa linia 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 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ł przeniesiony 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 na Linuksie) wstawia nowy wiersz gdy jest używany w zastępstwie regex zamiast powrotu karetki, jak radzili inni (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ę.

 17
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
2019-11-15 10:41:14

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

:s/\r/\r/g
 11
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
2019-11-15 09:58:24

Ale jeśli ktoś ma zastąpić, to działa:

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

W powyższym przykładzie, każdy następny wiersz jest zastępowany następnym wierszem, a następnie {[3] } i ponownie nowym wierszem. Jest to używane w tabelach wiki.

Jeśli tekst jest następujący:

line1
line2
line3

Zmienia się na

line1
|-
line2
|-
line3
 9
Author: Kiran K 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
2019-11-15 10:03:03

Oto odpowiedź, która mi pomogła. Od tego gościa:

----cytowanie Użyj edytora vi, aby wstawić znak nowej linii w replace


Coś jeszcze muszę zrobić i nie mogę sobie przypomnieć, 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 znaczeniem newline).

Aby uzyskać " ^M", wprowadź kombinację klawiszy Ctrl + V, a następnie (zwolnij wszystkie klawisze) naciśnij klawisz Enter.


 5
Author: Peter Mortensen,
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
2019-11-15 10:01:32

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

sed 's/\\n/\n/g' file > newfile
 5
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
2019-11-15 10:03:48