Инвертировать регулярные выражения в vim - PullRequest
8 голосов
/ 24 марта 2010

Здесь есть несколько вопросов о том, «как я могу инвертировать регулярное выражение» здесь, о переполнении стека, но я не могу найти один для vim (если он существует, моего Google-фу сегодня не хватает).

По сути, я хочу сопоставить все непечатаемые символы и удалить их. Я мог бы написать короткий скрипт или перейти в оболочку и использовать tr или что-то похожее для удаления, но vim-решение было бы неплохо: -)

У Vim есть атом \p, чтобы соответствовать печатным символам, однако попытка сделать это :s/[^\p]//g, чтобы соответствовать обратному, не удалась, и я просто оставил мне каждый 'p' в файле. Я видел последовательность (?!xxx) в других вопросах, и vim, похоже, не распознает эту последовательность. Я не нашел атома для непечатаемых символов.

А пока я перейду к внешним инструментам, но если у кого-нибудь есть какие-то хитрости для этого, было бы желательно: -)

Та!

Ответы [ 3 ]

10 голосов
/ 25 марта 2010

К сожалению, вы не можете поместить \p в классы персонажей, хотя это было бы неплохо. Однако вы можете использовать функцию негативного взгляда \@!, чтобы построить свой поиск:

/\p\@!.

Сначала убедитесь, что . может совпадать, только если это не символ \p.

1 голос
/ 24 марта 2010

Если вы хотите отфильтровать файл с помощью печатаемых символов Unicode (только если fileencoding = utf-8), вы можете сделать это в три этапа: пометить все печатаемые символы неиспользуемым символом UTF-8 (например, nr2char(0xFFFF) ), удалите все символы, за которыми не следует этот символ, и, наконец, удалите этот символ:

%s/\p\@<=/<ffff>/g
%s/[^<ffff>]<ffff>\@!//g
%s/<ffff>//g

Здесь вы должны заменить <ffff> действительным символом (если вы наберете это вместо <ffff> type <C-r>=nr2char(0xFFFF)<CR>).

Если вы не работаете с Unicode, используйте ответ dsummersl.

1 голос
/ 24 марта 2010

Я также немного озадачен, почему вы не можете использовать \ p. Но, [: print:] отлично работает:

:s/[^[:print:]]//g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...