поменять - 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 может сделать здесь работу для вас.





vi