Существуют некоторые, "как я инвертирую regexp" вопросы здесь на Переполнении стека, но я не могу найти один для энергии (если это действительно существует, моему Google-fu недостает сегодня).
В сущности я хочу соответствовать всем непечатаемым символам и удалить их. Я мог записать короткий сценарий, или опуститься до оболочки и использовать TR или что-то подобное для удаления, но решением для энергии будет денди :-)
Vim имеет атом \p
соответствовать печатаемым символам, однако пытаясь сделать это :s/[^\p]//g
соответствовать неудавшейся инверсии и просто оставило меня с каждым 'p' в файле. Я видел (?!xxx)
последовательность в других вопросах и энергия, кажется, не распознают эту последовательность. Я не нашел замеченными атом для непечатаемых символов.
Тем временем я собираюсь опуститься до внешних инструментов, но если бы у кого-либо есть какие-либо приемы их рукав, чтобы сделать это, это приветствовалось бы :-)
Ta!
К сожалению, вы не можете поместить \ p
в классы символов, хотя это было бы неплохо. Однако вы можете использовать функцию отрицательного просмотра \ @!
для построения поиска:
/\p\@!.
Сначала убедитесь, что .
может соответствовать, только если это не символ \ p
.
Я также немного озадачен, почему нельзя использовать \ p. Но [: print:] работает нормально:
:s/[^[:print:]]//g
Если вы хотите отфильтровать файл с печатаемыми символами Unicode (только если fileencoding=utf-8), вы можете сделать это в три этапа: пометить все печатаемые символы неиспользуемым символом UTF-8 (например, с помощью nr2char(0xFFFF)
), удалить все символы, за которыми не следует этот символ, и, наконец, удалить этот символ:
%s/\p\@<=/<ffff>/g
%s/[^<ffff>]<ffff>\@!//g
%s/<ffff>//g
Здесь вы должны заменить
на реальный символ (если вы вводите это, вместо
введите
).
Если вы не работаете с Unicode, используйте ответ dsummersl.