正規表現 - vim の \n と \r の違いは何ですか
高洛峰
高洛峰 2017-05-16 16:42:44
0
1
879

vim では、改行文字を置換するには n を検索する必要がありますが、改行文字に置換するには r です
つまり

リーリー

何も起こらない。理論的には、すべての n を r に置き換えて、再度検索できます

リーリー

まだ何もない、ただ

リーリー

価値があるので、原理を見つけてください~~~

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(1)
我想大声告诉你

以前noteに書きましたが、公開されていなかったので参考にさせていただきます。

(原文はマークダウン形式であり、SFでは完全にはサポートされていませんが、読むには影響ありません)

メモテキスト

Vimの改行問題
===============

Vim で s/n/n/g 会导致文件的换行全部被替换成 ^@ 字符,按照通常的理解,s/n/n/g 不应该有任何的效果,但在 Vim 中,n を使用する場合は、扱いが少し異なります。

:NL で使用される NUL をヘルプします

[<Nul>](http://vimdoc.sourceforge.net/htmldoc...) characters in the file are stored as [<NL>](http://vimdoc.sourceforge.net/htmldoc...) in memory. In the display they are shown as "^@". The translation is done when reading and writing files. To match a [<Nul>](http://vimdoc.sourceforge.net/htmldoc...) with a search pattern you can just enter [CTRL-@](http://www.vim.org/htmldoc/insert.htm...) or "[CTRL-V](http://www.vim.org/htmldoc/insert.htm...) 000". This is probably just what you expect. Internally the character is replaced with a [<NL>](http://vimdoc.sourceforge.net/htmldoc...) in the search pattern. What is unusual is that typing [CTRL-V](http://www.vim.org/htmldoc/insert.htm...) [CTRL-J](http://www.vim.org/htmldoc/insert.htm...) also inserts a [<NL>](http://vimdoc.sourceforge.net/htmldoc...), thus also searches for a [<Nul>](http://vimdoc.sourceforge.net/htmldoc...) in the file. {Vi cannot handle [<Nul>](http://vimdoc.sourceforge.net/htmldoc...) 文字がファイル内にあります}

この説明から、Vim では空文字 <Nul>(ASCII 0)在内存中是作为 <NL>(改行) が処理されることが分かります。

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

'n' は検索式内の文字列と一致するため、<Nul> 字符。在替换表达式中 'n' 会被解释为 <NL>,于是在内部,<Nul> 会被输入,所以在替换的表达式中 'n' 不再表示 'new line' 或者 'end-of-line'。同样,在搜索表达式中,输入 "CTRL-@" 或者 "CTRL-V 000" 表示 <Nul> 字符,但是在内部,他们还是都被替换为 <NL> 进行处理的,这也就是为什么直接键入 CTRL-V CTRL-J(输入的是 <NL> 文字自体ではなく、リテラルの '改行' 文字列が一致します)。これは同じ効果があります。

混乱の理由は、おそらく Vi が <Nul> 字符,而 Vim 由 Vi 发展而来,作者可能为了方便,直接使用了 <NL> 用来表示 <Nul>,这也就是 'NL-used-for-Nul' 的字面意思。与此同时,<NL> 原本的作用则使用 <CR> を置換としてサポートしていないためだと思います。これは、文字通りの意味では「CR-used-for-NL」です。

:NL で使用される CR のヘルプ

「fileformat」が「mac」の場合、ファイル内の <NL> 文字は、テキスト内では「^J」として表示されます。 <Nul> の場合は NL>。式の評価を行う場合、パターン内の <NL> は文字列内の <NL> と一致します。 NL> はそこでは機能せず、バッファ内のテキストと一致する場合にのみ機能します。
それでは、
(dos)を置換式でどのように表現すればよいのでしょうか。

<NL> 呢?答案就是 <CR>,可以使用 CRTL-V CRTL-M(输入的是 <CR> 字符本身) 或者 'r',Vim 并不会在文件中直接输入 <CR> 字符,它会根据当前 ‘fileformat’ 的设置来决定使用 <CR>(Mac),<NL>(*nix) 还是 <CR><NL>参考資料

--------


[Vim: n 対 r](http://stackoverflow.com/questions/35...)
  1. [なぜ r は Vim の改行なのですか?](http://stackoverflow.com/questions/71...)
  2. [Vim は正規表現を使用して「,」を改行に置き換えます](http://blog.longwin.com.tw/2008/08/vi...)
  3. [Vim で改行の文字を置き換える方法は?](http://stackoverflow.com/questions/71...)
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート