Expressions régulières - Quelle est la différence entre \n et \r de vim
高洛峰
高洛峰 2017-05-16 16:42:44
0
1
908

Dans vim, pour remplacer un caractère de nouvelle ligne, vous devez rechercher n mais pour le remplacer par un caractère de nouvelle ligne, c'est r
C'est à dire

:s/\n/\r/

Rien ne se passe. En théorie, je peux remplacer tous les n par des r, puis effectuer une nouvelle recherche

/\r

Toujours rien, seulement

/\n

Cela a de la valeur, veuillez trouver le principe~~~

高洛峰
高洛峰

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

répondre à tous(1)
我想大声告诉你

J'ai déjà écrit une note, mais elle n'a pas été rendue publique. Je la publie ici pour référence.

(Le texte original est au format markdown, ce qui n'est pas entièrement pris en charge par SF, mais cela n'affecte pas la lecture)

Note de texte

Problème de saut de ligne dans Vim
===============

Si vous souhaitez utiliser s/n/n/g dans Vim, tous les sauts de ligne du fichier seront remplacés par des caractères ^@. code>s /n/n/g ne devrait avoir aucun effet, mais dans Vim, n est géré légèrement différemment. s/n/n/g 会导致文件的换行全部被替换成 ^@ 字符,按照通常的理解,s/n/n/g 不应该有任何的效果,但在 Vim 中,n 的处理略有不同。

:help NL-used-for-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...) characters in the file at all}

从这段说明可以了解到在 Vim 中,空字符 <Nul>(ASCII 0)在内存中是作为 <NL>(newline) 进行处理的。

n matches an end-of-line
When matching in a string instead of buffer text a literal newline character is matched.

'n' 在搜索表达式中是在匹配一个字符串,所以字面意义的 'new line' 字符串会被匹配到,而不是 <Nul> 字符。在替换表达式中 'n' 会被解释为 <NL>,于是在内部,<Nul> 会被输入,所以在替换的表达式中 'n' 不再表示 'new line' 或者 'end-of-line'。同样,在搜索表达式中,输入 "CTRL-@" 或者 "CTRL-V 000" 表示 <Nul> 字符,但是在内部,他们还是都被替换为 <NL> 进行处理的,这也就是为什么直接键入 CTRL-V CTRL-J(输入的是 <NL>

 : aide NL-utilisé-pour-Nul🎜
[<Nul>](http://vimdoc.sourceforge.net/htmldoc...) les caractères du fichier sont stockés sous la forme [<NL>](http://vimdoc.sourceforge.net/htmldoc...) en mémoire, ils sont affichés sous la forme "^@". Pour faire correspondre un [<Nul>](http://vimdoc.sourceforge.net/htmldoc...) avec un modèle de recherche, vous pouvez simplement saisir [CTRL-@](http:// www.vim.org/htmldoc/insert.htm...) ou "[CTRL-V](http://www.vim.org/htmldoc/insert.htm...) 000". vous vous attendez. En interne, le caractère est remplacé par un [<NL>](http://vimdoc.sourceforge.net/htmldoc...) dans le modèle de recherche. [CTRL-V](http://www.vim.org/htmldoc/insert.htm...) [CTRL-J](http://www.vim.org/htmldoc/insert.htm...) insère également un [<NL>](http://vimdoc.sourceforge.net/htmldoc...), recherche donc également un [<Nul> ](http://vimdoc.sourceforge.net/htmldoc...) dans le fichier {Vi ne peut pas gérer [<Nul>](http://vimdoc.sourceforge.net/htmldoc ...) caractères dans le fichier
🎜À partir de cette description, vous pouvez comprendre que dans Vim, le caractère nul <Nul> (ASCII 0) est traité en mémoire comme <NL> (nouvelle ligne) de . 🎜
n correspond à une fin de ligne🎜Lors de la correspondance dans une chaîne au lieu d'un texte tampon, un caractère de nouvelle ligne littéral correspond.
🎜'n' correspond à une chaîne dans l'expression de recherche, donc la chaîne littérale 'nouvelle ligne' sera mise en correspondance, et non le caractère <Nul>. 'n' dans l'expression de remplacement sera interprété comme <NL>, donc en interne, <Nul> sera saisi, donc dans l'expression de remplacement 'n' non plus signifie « nouvelle ligne » ou « fin de ligne ». De même, dans l'expression de recherche, la saisie de "CTRL-@" ou "CTRL-V 000" représente le caractère <Nul>, mais en interne, ils sont toujours remplacés par <NL> est traité, c'est pourquoi taper directement CTRL-V CTRL-J (l'entrée est le caractère <NL> lui-même) a le même effet. 🎜

Je pense que la raison de la confusion peut être que Vi ne prend pas en charge le caractère <Nul> et que Vim a été développé à partir de Vi. L'auteur a peut-être utilisé &lt directement pour plus de commodité. NL> est utilisé pour représenter <Nul>, qui est la signification littérale de « NL-used-for-Nul ». Dans le même temps, la fonction originale de <NL> est remplacée par <CR>, qui est la signification littérale de « CR-used-for-NL ». . <Nul> 字符,而 Vim 由 Vi 发展而来,作者可能为了方便,直接使用了 <NL> 用来表示 <Nul>,这也就是 'NL-used-for-Nul' 的字面意思。与此同时,<NL> 原本的作用则使用 <CR> 来替代,这也就是 'CR-used-for-NL' 的字面意思。

:help CR-used-for-NL

When 'fileformat' is "mac", <NL> characters in the file are stored as <CR> characters internally. In the text they are shown as "^J". Otherwise this works similar to the usage of <NL> for a <Nul>.
When working with expression evaluation, a <NL> character in the pattern matches a <NL> in the string. The use of "n" (backslash n) to match a <NL> doesn't work there, it only works to match text in the buffer.

那么,我们如何在替换表达式里表示 <NL> 呢?答案就是 <CR>,可以使用 CRTL-V CRTL-M(输入的是 <CR> 字符本身) 或者 'r',Vim 并不会在文件中直接输入 <CR> 字符,它会根据当前 ‘fileformat’ 的设置来决定使用 <CR>(Mac),<NL>(*nix) 还是 <CR><NL>

 : aide CR-utilisé-pour-NL

Lorsque 'fileformat' est "mac", les caractères <NL> dans le fichier sont stockés en tant que caractères <CR> dans le texte, ils sont affichés sous la forme "^J". <NL> pour un <Nul>.
Lorsque vous travaillez avec l'évaluation d'une expression, un caractère <NL> dans le modèle correspond à un <NL> <NL> ne fonctionne pas ici, cela ne fonctionne que pour faire correspondre le texte dans le tampon.
Alors, comment représentons-nous <NL> dans l'expression de remplacement ? La réponse est <CR>, vous pouvez utiliser CRTL-V CRTL-M (l'entrée est le caractère <CR> lui-même) ou 'r', Vim le fera ne saisissez pas les caractères <CR> directement dans le fichier, et il décidera d'utiliser <CR> (Mac), <NL&gt en fonction de la configuration actuelle. paramètre 'fileformat' ;(*nix) ou <CR><NL>(dos).
  1. Références
  2. ---------
  3. [Vim : n contre r](http://stackoverflow.com/questions/35...)
  4. [Pourquoi r est-il une nouvelle ligne pour Vim ?](http://stackoverflow.com/questions/71...)
[Vim utilise l'expression régulière pour remplacer "," par des nouvelles lignes](http://blog.longwin.com.tw/2008/08/vi...)🎜 🎜[Comment remplacer un caractère pour une nouvelle ligne dans Vim ?](http://stackoverflow.com/questions/71...)🎜 🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal