поменять - vim удалить пустые строки
Как заменить символ символом новой строки в Vim? (8)
Используйте \r
вместо \n
.
Подстановка с помощью \n
вставляет в текст нулевой символ. Чтобы получить новую строку, используйте \r
. Однако при поиске новой строки вы все равно будете использовать \n
. Эта асимметрия обусловлена тем, что \n
и \r
делают несколько разные вещи :
\n
соответствует концу строки (новая строка), а \r
соответствует возврату каретки. С другой стороны, в подстановках \n
вставляет нулевой символ, тогда как \r
вставляет новую строку (точнее, она рассматривается как вход <CR> ). Вот небольшой, неинтерактивный пример, иллюстрирующий это, используя функцию командной строки Vim (другими словами, вы можете скопировать и вставить следующее в терминал для ее запуска). xxd
показывает hexdump полученного файла.
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
Before:
0000000: 6261 720a bar.
After:
0000000: 000a 720a ..r.
Другими словами, \n
вставил байт 0x00 в текст; \r
вставил байт 0x0a.
Я пытаюсь заменить каждый в текущем файле новой строкой:
:%s/,/\n/g
Но он вставляет то, что выглядит как ^@
вместо фактической новой строки. Файл не находится в режиме DOS или что-то еще.
Что я должен делать?
Если вам любопытно, как и я, проверьте вопрос Почему \ ra newline для Vim? также.
В синтаксисе s/foo/bar
\r
и \n
имеют разные значения, в зависимости от контекста.
короткая:
Для foo
:
\ n = новая строка (LF на linux / mac, CRLF на окнах)
\ r = возврат каретки (CR)
Для bar
:
\ r = - символ новой строки
\ n = нулевой байт.
дольше: (с номерами ascii)
NUL
= 0x00 = 0 = CTRL @
LF
= 0x0A = 10 = CTRL J
CR
= 0x0D = 13 = CTRL M
Вот список управляющих символов ASCII , вставьте их в vim
через CTRL v CTRL --- key --- .
В bash
или других оболочках unix / linux просто наберите CTRL --- key --- . Попробуйте CTRL M в bash, это то же самое, что и нажатие ENTER , поскольку оболочка понимает, что имеется в виду, хотя linux-системы используют Line Feeds для разграничения строк.
Чтобы вставить литерал в bash, добавление их с помощью CTRL v также будет работать.
Попробуйте в bash:
echo ^[[33;1mcolored.^[[0mnot colored.
Это использует escape-последовательности ANSI , вставьте два ^[
'через CTRL v ESC .
Вы также можете попробовать CTRL v CTRL m ENTER , что даст вам следующее:
bash: $'\r': command not found
Помнишь \r
сверху? :>
Этот список управляющих символов ASCII отличается от полной таблицы символов ASCII тем , что управляющие символы, которые вставляются в консоль / псевдотерминал / vim с помощью клавиши CTRL (ха-ха), можно найти там. Если в C и большинстве других языков вы обычно используете восьмеричные коды для представления этих «символов».
Если вы действительно хотите знать, откуда все это происходит: http://www.linusakesson.net/programming/tty/ .
Это лучшая ссылка, с которой вы столкнетесь в этой теме, но будьте осторожны: там будут драконы.
TL; DR
Обычно foo
= \n
и bar
= \r
.
Вы должны использовать
:%s/,/^M/g
Чтобы получить символ ^M
, нажмите Ctrl v, а затем Enter
Если вам нужно сделать для целого файла, мне также было предложено попробовать из командной строки
sed 's/\\n/\n/g' file > newfile
Но если нужно заменить, то следующее работает
:%s/\n/\r\|\-\r/g
в приведенной выше каждой следующей строке заменяется следующая строка, а затем | - и снова следующая строка. Это используется в вики-таблицах. если текст выглядит следующим образом:
line1
line2
line3
изменен на
line1
|-
line2
|-
line3
С помощью Vim для Windows используйте Ctrl + Q вместо Ctrl + V
Это ответ, который сработал для меня. От этого парня
---- цитирование http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/
Что-то еще я должен делать и не могу вспомнить, а затем искать.
В vi для вставки символа новой строки в поиск и замену выполните следующие действия:
:% s / look_for / replace_with ^ M / g команда выше заменит все экземпляры «look_for» на «replace_with \ n» (с \ n значением newline)
для получения «^ M» введите комбинацию клавиш «ctl-V», после чего (отпустите все клавиши) нажмите клавишу «enter».
\r
может сделать здесь работу для вас.