web-dev-qa-db-ja.com

Vim-1つの新しい行を2つの\ nで置き換える方法

Vimエディターで、vimコマンドモードを使用して改行文字(\ n)を2つの改行文字(\ n\n)に置き換えたい。

入力ファイルの内容:

This is my first line.
This is second line.

私が試したコマンド:

:%s/\n/\n\n/g

文字列を不要な文字に置き換えます。

This is my first line.^@^@This is second line.^@^@

それから私は次のコマンドを試しました

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

正常に動作しています。 2番目のコマンドでうまく機能する理由を説明できますか?

40
Raghvendra

奇妙なことに、replacementのvimの\nは、改行ではなくnullを意味します。 ASCII nul is ^@control@)。

歴史的に、viは^McontrolM)改行である行末として。 vimは、拡張機能\r(C言語と同様)を追加して^Mと同じことを意味しますが、開発者は、を置き換えるときに\nをnullにすることを選択しましたテキスト。これは、改行を見つけるsearchesでの使用と矛盾します。

参考文献:

52
Thomas Dickey

これを試してください:%s/$/^V^M/(ここで、^VCtrl-Vで、^MCtrl-Mです-^Vを入力すると、^文字が表示され、その上にバックスペースが表示されます。次に、^Mを入力すると、^Mとして表示されます... Ctrl-Vが標準ですtty literal next character-コマンドstty -aを実行して、ttyの特殊文字を表示します)。

7
Murray Jensen

vim使用\n null文字を表す\0メモリ内で、vimハンドルファイルにnull文字が含まれている方法(viはできません)。

の用法 \n式で使用する場合、文字列の改行ではなく、バッファの行末にのみ一致します。

詳細は :h NL-used-for-Null および :h CR-used-for-NL を参照してください。

6
cuonglm

Neovim(nvim)およびVimバージョンでテスト済み

NVIM v0.3.0
VIM - Vi IMproved 8.1

改行を削除します:

cell
allele
rs2981578
fgfr2

ここで、\nは改行に一致します(ただし、insert改行しますが、\rを使用してください)。

:'<,'>s/\n/|/g

cell|allele|rs2981578|fgfr2

改行を追加:

いいえ:

cell|allele|rs2981578|fgfr2

:'<,'>s/\n/|/g

cell^@allele^@rs2981578^@fgfr2

^@は、LFの分音記号です(改行、 http://vimhelp.appspot.com/digraph.txt.html#digraphs-default)を参照 =)

はい:

cell|allele|rs2981578|fgfr2

:'<,'>s/|/\r/g

cell
allele
rs2981578
fgfr2

OPの質問(1つの\nを2つの\n\nに置き換える方法)に対処するには、別の\rを追加します。

cell
allele
rs2981578
fgfr2

:'<,'>s/\n/\r\r/g

cell

allele

rs2981578

fgfr2

...つまり、元の改行(\n)に一致させ、2つの改行/改行(\r\r)で置き換えます。

2
Victoria Stuart