Vraag Hoe een personage vervangen door een nieuwe regel in Vim?


Ik probeer elk te vervangen , in het huidige bestand door een nieuwe regel:

:%s/,/\n/g 

Maar het voegt wat lijkt op een ^@ in plaats van een echte nieuwe regel. Het bestand bevindt zich niet in de DOS-modus of zoiets.

Wat moet ik doen?

Als je nieuwsgierig bent, zoals ik, controleer dan de vraag Waarom is een nieuwe regel voor Vim? ook.


1587
2017-09-16 11:19


oorsprong


antwoorden:


Gebruik \r in plaats van \n.

Vervangen door \n voegt een leeg teken in de tekst in. Gebruik om een ​​nieuwe regel te krijgen \r. Wanneer zoeken voor een nieuwe regel zou je nog steeds gebruiken \nechter. Deze asymmetrie is te wijten aan het feit dat \n en \r  doe iets verschillende dingen:

\n komt overeen met een einde van de regel (newline), terwijl \r komt overeen met een carriage return. Aan de andere kant, in vervangingen \n voegt een null-teken in, terwijl \r voegt een nieuwe regel in (meer precies, het wordt als de invoer behandeld <CR>). Hier is een klein, niet-interactief voorbeeld om dit te illustreren, met behulp van de Vim-opdrachtregelfunctie (met andere woorden, je kunt het volgende kopiëren en plakken in een terminal om het uit te voeren). xxd toont een hexdump van het resulterende bestand.

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.

Met andere woorden, \n heeft de byte 0x00 in de tekst ingevoegd; \r heeft de byte 0x0a ingevoegd.


2074
2017-09-16 11:21



Dit is de truc:

Stel eerst uw vi (m) -sessie in om patroonaanpassing met speciale tekens toe te staan ​​(di: newline). Het is waarschijnlijk de moeite waard om deze regel in uw .vimrc- of .exrc-bestand te plaatsen.

:set magic

Doe vervolgens:

:s/,/,^M/g

Om de ^M karakter, type Controle-v en druk op invoeren. Onder Windows, doe Controle-q, invoeren. De enige manier waarop ik me deze kan herinneren is door te onthouden hoe weinig zin ze maken:

EEN: Wat zou het slechtste controlekarakter zijn om te gebruiken om een ​​nieuwe regel te vertegenwoordigen?

B: Een van beide q (omdat het meestal "stoppen" betekent) of v omdat het zo gemakkelijk zou zijn om te typen Controle-c per ongeluk en dood de editor.

EEN: Maak het zo.


166
2017-09-25 23:40



In de syntaxis s/foo/bar  \r en \n verschillende betekenissen hebben, afhankelijk van de context.


Voor foo:
\ n = nieuwe regel
\ r = CR (carriage return = Ctrl-M = ^ M)

Voor bar:
\ r = is newline
\ n = nul byte (0x00).


Ik heb in het verleden nogal wat vragen over dergelijke dingen gezien en ergens in de toekomst zal bijna niemand meer iets weten over dit spul, uiteindelijk ...

Op 'populair' verzoek:

Hier is een lijst van de ASCII-besturingstekens, plaats ze in vim via CTRLvCTRL---sleutel---.
In bash of de andere unix / linux shells typen gewoon CTRL---sleutel---. Proberen CTRLM in bash is het hetzelfde als slaan ENTER, terwijl de shell zich realiseert wat er wordt bedoeld, ook al gebruiken linux-systemen Line Feeds voor het afbakenen van regels. Alleen de control char voor Line Feed is CTRL-A, die gebonden is aan 'spring naar het begin van de regel' in bash.

Om letterlijke in te voegen in bash, CTRLv zal ook werken.

Probeer in bash:

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

Dit gebruikt ANSI-escape-reeksen, plaats de twee ^[is via CTRLvESC.

Je zou ook kunnen proberen CTRLvCTRLmENTER, wat je dit zal geven:

bash: $'\r': command not found

Herinner de \r van boven? >

De ASCII-besturingstekens lijst is anders dan de standaard ascii symbool tafel, in die zin dat de controle karakters, die in de console worden geplaatst / pseudoterminal / vim via de CTRL sleutel (haha), is daar te vinden. Terwijl je in C en de meeste andere talen meestal de octale codes gebruikt om deze 'karakters' weer te geven.

Als je echt wilt weten waar dit allemaal vandaan komt: http://www.linusakesson.net/programming/tty/.
Dit is de beste link die je tegenkomt over dit onderwerp, maar pas op: Er zijn draken.


TL; DR

doorgaans foo = \n, en bar = \r.


65
2017-09-23 14:00



Je moet gebruiken

:%s/,/^M/g

Om de ^M teken, druk op Ctrl  v gevolgd door invoeren


45
2017-09-16 11:30



\r kan het werk hier voor je doen.


27
2017-09-16 11:21



Met Vim op Windows gebruik Ctrl+Q in plaats van Ctrl+V


20
2017-09-16 11:45



Van verduistering, de ^M tekens kunnen in een regel worden ingesloten en u wilt deze naar nieuwe regels converteren.

:s/\r/\r/g

8
2017-09-06 17:53