как заменить символ новой строкой в vim

<p>я пытаюсь заменить каждый <code>,</code> в текущем файле новой строкой:</p><pre><code>:%s/,/\n/g </code></pre><p>но он вставляет то, что выглядит как <code>^@</code> вместо фактического перевода строки. файл не в режиме dos или что-то еще.</p><p>что я должен делать?</p><p>если вам любопытно, как и мне, проверьте вопрос <em> <a href="https://stackoverflow.com/questions/71417/why-is-r-a-newline-for-vim">почему же\r является новой строкой для vim?</a> </em>.</p>

<h2>используйте <code>\r</code> вместо <code>\n</code>.</h2><p>подстановка <code>\n</code> вставляет нулевой символ в текст. чтобы получить новую строку, используйте <code>\r</code>. при <em> поиске </em> новой строки вы все равно используете <code>\n</code>. эта асимметрия связана с тем, что <code>\n</code> и <code>\r</code> <a href="http://vim.wikia.com/wiki/search\_and\_replace">делают немного разные вещи</a> :</p><p><code>\n</code> соответствует концу строки (новая строка), тогда как <code>\r</code> соответствует возврату каретки. с другой стороны, в подстановках <code>\n</code> вставляет нулевой символ, тогда как <code>\r</code> вставляет новую строку (точнее, он обрабатывается как ввод <kbd><cr></kbd>). вот небольшой неинтерактивный пример, чтобы проиллюстрировать это, используя функцию командной строки vim (другими словами, вы можете скопировать и вставить следующее в терминал, чтобы запустить его). <code>xxd</code> показывает hexdump полученного файла.</p><pre><code>echo bar > test (echo 'before:'; xxd test) > output.txt vim test '+s/b/\n/' '+s/a/\r/' +wq (echo 'after:'; xxd test) >> output.txt more output.txt </code></pre><pre><code>before: 0000000: 6261 720a bar. after: 0000000: 000a 720a ..r. </code></pre><p>другими словами, <code>\n</code> вставил байт 0x00 в текст; <code>\r</code> вставил байт 0x0a.</p>

<p>вот хитрость:</p><p>сначала установите сеанс vi (m), чтобы разрешить сопоставление с шаблоном с помощью специальных символов (например, новая строка). вероятно, стоит поместить эту строку в ваш файл .vimrc или .exrc.</p><pre><code>:set magic </code></pre><p>затем сделайте:</p><pre><code>:s/,/,^m/g </code></pre><p>чтобы получить символ <code>^m</code>, введите <kbd>control</kbd>-<kbd>v</kbd> и ударил <kbd>enter</kbd>, под виндой делай <kbd>control</kbd>-<kbd>q</kbd>, <kbd>enter</kbd>, единственный способ запомнить это, помня, как мало они имеют смысла:</p><blockquote> <p>a: <em>какой наименьший управляющий символ использовать для представления новой строки?</em></p> <p>b: <em>либо <code>q</code> (потому что это обычно означает "выход"), либо <code>v</code>, потому что это было бы так легко набрать <kbd>control</kbd>-<kbd>c</kbd> по ошибке убей и редактора.</em></p> <p>a: <em>сделать так.</em></p> </blockquote>

<p>в синтаксисе <code>s/foo/bar</code> <code>\r</code> и <code>\n</code> имеют разные значения в зависимости от контекста.</p><hr><h2>короткая:</h2><p>для <code>foo</code>:<br> \n = новая строка (lf в linux/mac, crlf в windows)<br> \r = возврат каретки (cr)<br></p><p>для <code>bar</code>:<br> \r = перевод строки<br> \n = нулевой байт.<br></p><h2>длиннее: (с номерами ascii)</h2><p><code>nul</code> = 0x00 = 0 = <kbd>ctrl</kbd><kbd>@</kbd><br> <code>lf</code> = 0x0a = 10 = <kbd>ctrl</kbd><kbd>j</kbd><br> <code>cr</code> = 0x0d = 13 = <kbd>ctrl</kbd><kbd>m</kbd></p><p>вот список <a href="http://www.cs.tut.fi/~jkorpela/chars/c0.html">управляющих символов ascii</a> , вставьте их в <code>vim</code> через <kbd>ctrl</kbd><kbd>v</kbd><kbd>ctrl</kbd><kbd>---key---</kbd>,.<br> в <code>bash</code> или других оболочках unix/linux просто введите <kbd>ctrl</kbd><kbd>---key---</kbd>, пытаться <kbd>ctrl</kbd><kbd>m</kbd> в баш, это так же, как удар <kbd>enter</kbd>, поскольку shell понимает, что имеется в виду, несмотря на то, что системы linux используют line feeds для разграничения строк.</p><p>вставить литералы в bash, добавив к ним <kbd>ctrl</kbd><kbd>v</kbd> тоже будет работать.</p><p>попробуй в bash:</p><pre><code>echo ^[[33;1mcolored.^[[0mnot colored. </code></pre><p>при этом используются <a href="http://en.wikipedia.org/wiki/ansi\_escape\_code">escape-последовательности ansi</a> , вставьте два <code>^[</code> через <kbd>ctrl</kbd><kbd>v</kbd><kbd>esc</kbd>,.</p><p>вы также можете попробовать <kbd>ctrl</kbd><kbd>v</kbd><kbd>ctrl</kbd><kbd>m</kbd><kbd>enter</kbd>, который даст вам это:</p><pre><code>bash: $'\r': command not found </code></pre><p>помните <code>\r</code> сверху? :></p><p>этот список <a href="http://www.cs.tut.fi/~jkorpela/chars/c0.html">управляющие символы ascii</a> отличается от полного <a href="http://ascii-code.com/">таблица символов ascii</a> тем, что управляющие символы, которые вставляются в консоль/псевдотерминал/vim через <kbd>ctrl</kbd> ключ (хаха), можно найти там. в то время как в си и большинстве других языков вы обычно используете восьмеричные коды для представления этих "символов".</p><p>если вы действительно хотите знать, откуда все это происходит: <a href="http://www.linusakesson.net/programming/tty/">http://www.linusakesson.net/programming/tty/</a> .<br> это лучшая ссылка, которую вы встретите на эту тему, но будьте осторожны: там будут драконы.</p><hr><p><em> tl; dr </em></p><p>обычно <code>foo</code> = <code>\n</code> и <code>bar</code> = <code>\r</code>.</p>

<p>вам нужно использовать</p><pre><code>:%s/,/^m/g </code></pre><p>чтобы получить символ <code>^m</code>, нажмите <kbd>ctrl</kbd> <kbd>v</kbd> с последующим <kbd>enter</kbd></p>

<p><code>\r</code> может сделать работу здесь за вас.</p>

<p>с использованием vim на windows <kbd>ctrl</kbd>+<kbd>q</kbd> на месте <kbd>ctrl</kbd>+<kbd>v</kbd></p>

<p>это лучший ответ на мой взгляд, но в таблице это было бы лучше: <a href="https://stackoverflow.com/a/12389839/962394">https://stackoverflow.com/a/12389839/962394</a> .</p><p>итак, формулировка:</p><p>вам нужно использовать <code>\r</code>, чтобы использовать перевод строки (ascii <code>0x0a</code>, перевод строки unix) при замене регулярного выражения, но это характерно для замены - обычно следует ожидать, что <code>\n</code> будет использоваться для перевода строки и <code>\r</code> для возврата каретки.</p><p>это потому, что vim использовал <code>\n</code> в замене, чтобы обозначать символ nil (ascii <code>0x00</code>). вы, возможно, ожидали, что вместо этого nil будет <code>\0</code>, освобождая <code>\n</code> для его обычного использования для перевода строки, но <code>\0</code> уже имеет значение в заменах регулярных выражений, поэтому он был перемещен в <code>\n</code>. следовательно, затем мы продолжаем также сдвигать новую строку с <code>\n</code> на <code>\r</code> (который в шаблоне регулярного выражения является символом возврата каретки, ascii <code>0x0d</code>).</p><pre> персонаж | код ascii | c представление | регулярное выражение | замена регулярных выражений ------------------------- + ------------ + ---- -------------- + ------------- + --------------------- --- ноль | 0x00 |\0 |\0 |\n перевод строки (новая строка unix) | 0x0a |\n |\n |\r возврат каретки | 0x0d |\г |\г | <неизвестно> </pre><p>nb: <code>^m</code> (ctrl-v ctrl-m в linux) вставляет новую строку при использовании в замене регулярного выражения, а не в возврате каретки, как советуют другие (я только что попробовал).</p><p>также обратите внимание, что vim будет переводить символ перевода строки при сохранении в файл в соответствии с настройками формата файла, что может привести к путанице.</p>

<p>из eclipse символы <code>^m</code> могут быть встроены в строку, и вы хотите преобразовать их в новые строки.</p><pre><code>:s/\r/\r/g </code></pre>

<p>но если нужно заменить, то следующая вещь работает</p><pre><code>:%s/\n/\r\|\-\r/g </code></pre><p>в приведенном выше примере каждая следующая строка заменяется следующей строкой, а затем | - и снова следующей строкой. это используется в вики-таблицах. если текст выглядит следующим образом:</p><pre><code>line1 line2 line3 </code></pre><p>изменено на</p><pre><code>line1 |- line2 |- line3 </code></pre>

<p>если вам нужно сделать для целого файла, мне также предложили попробовать из командной строки</p><pre><code>sed 's/\\n/\n/g' file > newfile </code></pre>

<p>вот ответ, который работал для меня. от этого парня</p><p>---- цитирование <a href="http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/">http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/</a> </p><hr><p>что-то еще, что я должен сделать и не могу вспомнить, а затем должен искать.</p><p>в vi для вставки символа новой строки в поиск и замену выполните следующие действия:</p><p>:% s/look\_for/replace\_with ^ m/g указанная выше команда заменит все экземпляры "look\_for" на "replace\_with\n" (с\n означает перевод строки)</p><p>чтобы получить "^ m", введите комбинацию клавиш "ctl-v", затем (отпустите все клавиши) нажмите клавишу "enter".</p><hr>