В конце каждой строки повторяются следующие символы:
^[[00m
Как я могу удалить их из каждой строки с помощью редактора Vim?
Когда я даю команду :%s/^[[00m//g
, она не работает.
В конце каждой строки повторяются следующие символы:
^[[00m
Как я могу удалить их из каждой строки с помощью редактора Vim?
Когда я даю команду :%s/^[[00m//g
, она не работает.
Вы можете использовать :%s/.\{6}$//
, чтобы буквально удалить 6 символов с конца каждой строки.
:
запускает ex-режим, который позволяет выполнить команду. %
- это диапазон, который указывает, что эта команда должна работать со всем файлом. s
обозначает замену, за которым следует шаблон и заменяет строку в формате s/pattern/replacement/
. Наш шаблон в этом случае равен .\{6}$
, что означает совпадение любого символа (.
) ровно 6 раз (\{6}
), за которым следует конец строки ($
), и замените его на нашу заменяющую строку, которая ничего, Поэтому, как я сказал выше, это соответствует последним 6 символам каждой строки и не заменяет их ничем.
Я бы использовал глобальную команду.
Попробуйте следующее:
:g/$/norm $xxxxxx
или даже:
:g/$/norm $5Xx
Я думаю, что ключом к этой проблеме является сохранение его универсальным и не специфичным для символов, которые вы пытаетесь удалить. Таким образом, техника, которую вы изучите, будет применима ко многим другим ситуациям.
Предполагая, что это escape-последовательность ANSI, ^[
обозначает один символ <Esc>
. Вы должны ввести его, нажав Ctrl + V (или Ctrl + Q) на многих установках Windows Vim), а затем Esc. Обратите внимание, как это затем выделяется немного другим цветом.
Достаточно легко заменить последние шесть символов каждой строки агностически на то, что эти символы, но она оставляет значительную комнату для ошибок, поэтому я бы не рекомендовал ее. Кроме того, если ^[
является escape-символом, вы действительно ищете пять символов.
Используя ga на символе ^[
, вы можете определить, будет ли это код выхода, и в этом случае строка состояния отобразит
<^[> 27, Hex 1b, Octal 033
Предполагая, что вы можете заменить все, используя
:%s/\%x1b\[00m$//gc
С \%x1b
, исходя из шестнадцатеричного значения выше. Также обратите внимание, что вам нужно выйти из скобки ([
), потому что это зарезервированный символ в регулярном выражении Vim. $
гарантирует, что он встречается в конце строки, а флаги /gc
сделают его глобальным и подтвердят каждую замену (вы можете нажать a
, чтобы заменить все).
Это просто вопрос ускользания. Вы можете использовать любой из двух ниже:
:%s/\^\[\[00m$//gc
:%s/\V^[[00m\$//gc
Если все они выравниваются, вы можете сделать выбор из визуального блока и затем удалить его.
В противном случае, если у вас есть последовательность, неизвестная для ввода, вы можете визуально выбрать ее, нажав v
, затем отметьте и выдержите ее y
(по умолчанию в регистр "
). Затем введите :%s/<C-R>"//g
, чтобы удалить его.
Примечание:
<C-R>"
помещает содержимое регистра "
в позицию курсора."ay
(yank для регистрации a
- piglatin yank, как я его называю) и забыл, куда вы его положили, вы можете посмотреть содержимое своих регистров с помощью :reg
.<C-R>
говорит Vim для Ctrl + RКажется, что это нормально, если длина строки больше 5 символов:
:perldo $_ = substr $_, 0, -5
но когда длина строки равна 5 или менее, она ничего не делает. Возможно, в perl есть простой способ удалить последние 5 символов строки, но я этого не знаю:)
Используйте это для удаления:
:%s/^[[00m//gc