it-swarm-eu.dev

Jak se označuje jako nový řád ve Vimu

Snažím se nahradit každý , v aktuálním souboru novým řádkem:

:%s/,/\n/g 

Ale místo skutečného nového řádku vloží to, co vypadá jako ^@. Soubor není v režimu DOS nebo cokoliv.

Co bych měl dělat?

Pokud jste zvědaví, jako já, podívejte se na otázkuProč je pro Vim nový řádek?stejně.

1755
Vinko Vrsalovic

Použijte \r místo \n.

Nahrazení znakem \n vloží do textu nulový znak. Chcete-li získat nový řádek, použijte \r. Pokud vyhledávání pro nový řádek, stále používáte \n. Tato asymetrie je způsobena tím, že \n a \rdělejte trochu jiné věci :

\n odpovídá konci řádku (nový řádek), zatímco \r odpovídá návratu vozíku. Na druhou stranu, v substitucích \n vloží nulový znak, zatímco \r vloží nový řádek (přesněji řečeno, je to považováno za vstup <CR>). Zde je malý neinteraktivní příklad pro ilustraci pomocí funkce příkazové řádky Vim (jinými slovy můžete kopírovat a vkládat následující do terminálu, abyste jej mohli spustit). xxd zobrazí hexdump výsledného souboru.

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.

Jinými slovy, \n vložil do textu bajt 0x00; \r vložil byte 0x0a.

2317
Konrad Rudolph

Tady je trik:

Nejprve nastavte relaci vi (m) tak, aby umožňovala shodu vzorů se speciálními znaky (např .: nový řádek). Je to pravděpodobně stojí za to tento řádek v souboru .vimrc nebo .exrc.

:set magic

Dále:

:s/,/,^M/g

Chcete-li získat znak ^M, zadejte jej Control-v a hit Enter. V systému Windows proveďte Control-qEnter. Jediný způsob, jak si na to vzpomínám, je zapamatování si, jak malý smysl činí

A: Jaký by byl nejhorší kontrolní znak, který by měl představovat nový řádek?

B: Buď q (protože to obvykle znamená "Quit") nebo v, protože by to bylo tak snadné napsat Control-c omylem a zabít editora.

A: dělej to tak.

184
Logan

V syntaxi s/foo/bar\r a \n mají různé významy v závislosti na kontextu.


krátký:

Pro foo:
n. newline (LF na linux/mac, CRLF na oknech)
r = návrat vozíku (CR)

Pro bar:
r = je nový řádek
n. n = nulový bajt.

delší: (s ascii čísly)

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

Zde je seznam ASCII řídicích znaků , vložte je do vim via CTRLvCTRL---key---.
V bash nebo v jiných unixových/linuxových shellech stačí napsat CTRL---key---. Snaž se CTRLM v bash, jeho stejný jako bít ENTER, protože Shell si uvědomuje, co je míněno, i když linuxové systémy používají linkový kanál pro ohraničení řádků.

Chcete-li vložit literál v bash, předpřipravit je CTRLv bude fungovat.

Vyzkoušejte bash:

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

To používá ANSI escape sekvence , vložte dva ^[ 's přes CTRLvESC.

Můžete také zkusit CTRLvCTRLmENTER, které vám to dá:

bash: $'\r': command not found

Zapamatujte si \r shora? :>

Tento ASCII řídicí znaky seznam se liší od úplného ASCII symbol tabulka , v tom, že kontrolní znaky, které jsou vloženy do konzoly/pseudoterminal/vim přes CTRL klíč (haha), najdete zde. Zatímco v jazyce C a ve většině ostatních jazyků obvykle používáte osmičkové kódy, které představují tyto „znaky“.

Pokud opravdu chcete vědět, odkud pochází: http://www.linusakesson.net/programming/tty/ .
Toto je nejlepší odkaz, se kterým se na toto téma setkáte, ale pozor: Jsou drakové.


TL; DR

Obvykle foo = \n a bar = \r.

84
sjas

Musíte použít

:%s/,/^M/g

Chcete-li získat znak ^M, stiskněte klávesu Ctrlv následován Enter

50
dogbane

\r vám může udělat tu práci.

33
Lasar

S Vim na Windows Ctrl+Q namísto Ctrl+V

22
grantc

To je nejlepší způsob, jak si myslím, ale to by bylo hezčí v tabulce: https://stackoverflow.com/a/12389839/962394 .

Přeformulování:

Musíte použít \r použít line feed (ascii 0x0a, unix newline) v náhradě regex, ale to je zvláštní pro náhradu - měli byste normálně pokračovat v použití \n pro line feed a \r pro návrat vozíku.

Je to proto, že vim používá \n jako náhradu za znak NIL (ascii 0x00). Možná jste čekali, že NIL bude místo toho \0, uvolní \n pro jeho obvyklé použití pro line feed, ale \0 již má význam v regex náhradách, takže byl přesunut na \n. Proto se dále posouváme také o nový řádek z \n do \r (který je v regexovém vzoru znakem návratu vozíku, ascii 0x0d).

 znak | ascii kód | Zastoupení C regex zápas | regex náhrada 
 ------------------------- + ------------ + ---- -------------- + ------------- + --------------------- --- 
 nil | 0x00 | 0 | 0 | n 
 line feed (unix newline) | 0x0a | n n r 
 návrat vozíku 0x0d | r r <neznámé> 

Pozn .: ^M (Ctrl-V Ctrl-M na linuxu) vloží nový řádek, když se použije v náhradě regexu spíše než návrat vozíku, jak ostatní doporučili (já jsem to zkusil).

Všimněte si také, že vim bude překládat znak posuvu řádku, když se uloží do souboru na základě nastavení formátu souboru a to by mohlo zmást záležitosti.

10
codeshot

Z Eclipse mohou být znaky ^M vloženy do řádku a chcete je převést na nové řádky.

:s/\r/\r/g
10
rickfoosusa

Ale pokud člověk musí nahradit, pak následuje věc

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

ve výše uvedeném je každý další řádek nahrazen dalším řádkem a poté | - a opět dalším řádkem. To se používá v tabulkách wiki. pokud je text následující:

line1
line2
line3

se změní na

line1
|-
line2
|-
line3
7

Pokud potřebujete udělat pro celý soubor, bylo mi také doporučeno, abyste se pokusili z příkazového řádku

sed 's/\\n/\n/g' file > newfile
6
Evan Donovan

Je to odpověď, která pracovala pro mě. Od toho chlapa

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


Něco jiného, ​​co musím udělat a nemohu si vzpomenout a pak se musím podívat nahoru.

V případě vložení znaku nového řádku do hledání a nahrazení proveďte následující:

:% s/look_for/replace_with ^ M/g výše uvedený příkaz nahradí všechny instance výrazu „look_for“ výrazem „replace_with n“ (s n znamená nový řádek)

chcete-li získat „^ M“, zadejte kombinaci kláves „ctl-V“ a poté stiskněte tlačítko „enter“.


4
user407749