Инвертируйте regexp в энергии

Существуют некоторые, "как я инвертирую regexp" вопросы здесь на Переполнении стека, но я не могу найти один для энергии (если это действительно существует, моему Google-fu недостает сегодня).

В сущности я хочу соответствовать всем непечатаемым символам и удалить их. Я мог записать короткий сценарий, или опуститься до оболочки и использовать TR или что-то подобное для удаления, но решением для энергии будет денди :-)

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

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

Ta!

9
задан user314104 14 January 2012 в 20:01
поделиться

3 ответа

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

/\p\@!.

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

10
ответ дан 3 November 2019 в 00:00
поделиться

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

:s/[^[:print:]]//g
1
ответ дан 3 November 2019 в 00:00
поделиться

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

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

Здесь вы должны заменить на реальный символ (если вы вводите это, вместо введите =nr2char(0xFFFF)).

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

1
ответ дан 3 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: