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番目のコマンドでうまく機能する理由を説明できますか?
奇妙なことに、replacementのvimの\n
は、改行ではなくnullを意味します。 ASCII nul is ^@
(control@)。
歴史的に、viは^M
(controlM)改行である行末として。 vimは、拡張機能\r
(C言語と同様)を追加して^M
と同じことを意味しますが、開発者は、を置き換えるときに\n
をnullにすることを選択しましたテキスト。これは、改行を見つけるsearchesでの使用と矛盾します。
参考文献:
これを試してください:%s/$/^V^M/
(ここで、^V
はCtrl-V
で、^M
はCtrl-M
です-^V
を入力すると、^
文字が表示され、その上にバックスペースが表示されます。次に、^M
を入力すると、^M
として表示されます... Ctrl-Vが標準ですtty literal next character-コマンドstty -a
を実行して、ttyの特殊文字を表示します)。
vim
使用\n
null文字を表す\0
メモリ内で、vim
ハンドルファイルにnull文字が含まれている方法(vi
はできません)。
の用法 \n
式で使用する場合、文字列の改行ではなく、バッファの行末にのみ一致します。
詳細は :h NL-used-for-Null および :h CR-used-for-NL を参照してください。
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
)で置き換えます。