Vraの\ ra改行はなぜですか?


254

質問からVimで改行の文字を置き換える方法は?。次のように、改行のテキストを置き換えるときは\ rを使用する必要があります

:%s/%/\r/g

しかし、文字の行末と改行を置き換えるときは、次のようにできます。

:%s/\n/%/g 

マニュアルのどのセクションがこれらの動作を文書化しており、それらの背後にある理由は何ですか?


1
%検索と置換の際のは何ですか?
2013年

7
@qed:デフォルトで:sは、現在の行にのみ置換が適用されます。:%sファイル全体をアドレス指定します。もっと
c24w 2014年

3
+ c24w彼はスラッシュの間の '%'を参照していると思います。最初の例では '%'が検索場所にあり、2番目の例では置換場所にありますが、質問に答えるために@qed、それらの '%は文字通り一致します。
ラスタジェダイ2016

回答:


155

パターンに関するvimドキュメントから:

\r <CR>に一致

\n 行末に一致-バッファテキストではなく文字列で一致する場合、リテラルの改行文字が一致します。


41
私にとって混乱のポイントは、\ rと\ nを使用すると、検索パターンと置換パターンが異なる意味になるということです。
dlamblin

3
@dlamblinうん!私の答えを参照してください:)
限定的な贖罪2014年


114

これのもう1つの側面\0は、伝統的にNULLであるが、s//\0/「一致したパターン全体」を意味するために使用される ことです。(ちなみに、これはと冗長で、より長いです&)。

  • つまり、を使用\0することはできないNULLので、\n
  • つまり、を使用\nすることはできない\nので、を使用します\r
  • つまり、\rを意味するために使用することはできません\rが、わざとそのcharを誰が追加したいのかわかりません。

—☈


1
いい視点ね!つまり、これは\ 0-0番目のネストされたグループへの後方参照-正規表現全体のハックです。これは非常に良い答えですが、\ rを置換で使用できないことを失望させます...(つまり、「通常の」ファイル(== unix EOL)に#(13)を挿入します)。
Tomasz Gandor 2013年

3
はい、答えはVimのドキュメントにあります。通常のバックスラッシュを使用して、\ ^ Mまたは\ <CR>をエスケープします。いいね。-----この時点で<CR>行を2つに分割(<CR>をCTRL-V <Enter>として入力) s <CR> \ r idem -------- s / \ r \ < CR>改行を挿入(CTRL-M)(<CR>をCTRL-V <Enter>として入力) s / \ <CR>
Tomasz Gandor 2013年

16
「別の側面」?あなたは控えめすぎる!これが起こる理由を正確に説明することで、対処方法を述べるだけのすべての人に対して優れた答えが得られます。+1
underscore_d

これは、検索パターンと置換パターンで異なる意味がある理由についての正直なところ、本当に素晴らしい洞察\nです。素晴らしい答え。
ZeroKnight 2019

47

:help NL-used-for-Nul

技術的な詳細:

<Nul>ファイル内の文字は<NL>メモリと同じように保存されます。ディスプレイでは「^@」と表示されます。ファイルを読み書きするときに変換が行われます。を<Nul>検索パターンに一致させるには、CTRL- @または " CTRL-V 000"を入力するだけです。これはおそらくあなたが期待しているものです。内部的には、文字は<NL>検索パターンでa に置き換えられます。珍しいのは、CTRL-V CTRL-Jを入力するとも挿入される<NL>ため<Nul> 、ファイル内でも検索されることです。{Vi <Nul>はファイル内の文字をまったく処理できません}



10

まず、:h :s「変更」に関するドキュメンテーションの「4.2置換」セクションを開きます。コマンドが受け入れるものは次のとおりです。

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

patternおよびに関する説明に注意してくださいstring

{pattern}を参照してください|pattern|
{string}リテラル文字列または
特別なものにすることができます。参照してください|sub-replace-special|

これで、検索パターンと置換パターンが異なる規則に従っていることがわかりました。へのリンクをたどると、|pattern|Vimで使用される正規表現パターン全体を説明するセクションに移動します。

その間、|sub-replace-special|「4.2置換」のサブセクションに移動します。置換には\r、改行/分割用のパターンが含まれています。

(マニュアルのこの部分へのショートカットは:h :s%

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.