Perl: Удалите все не-ascii символы, кроме определенных

Я хочу удалить из текстового файла все символы, не входящие в ASCII, кроме смайликов Юникод. Я использую следующую команду, которая удалит все не-ASCII символы.

perl -i.bak -pe 's/[^[:ascii:]]//g'

Можно ли изменить эту команду, чтобы исключить символы смайликов?

РЕДАКТИРОВАТЬ:

Пример ввода: Good morning! #Happy #StPatricksDay ♣♥

Образец вывода: Good morning! #Happy #StPatricksDay

2 ответа

Решение

Вы можете указать диапазон в Perl следующим образом:

s='Good morning! #Happy #StPatricksDay ♣♥'

echo "$s" | perl -C -pe 's/[^[:ascii:]\x{1F600}-\x{1F64F}]+//g'
Good morning! #Happy #StPatricksDay 

Ссылка: Юникод блок для смайликов

Просто добавьте символы, которые вы хотите исключить, чтобы включить смайлики:

perl -i.bak -pe 's/[^[:ascii:]\p{block:Emoticons}\N{U+2639}\N{U+263A}\N{U+263B}]//g'

редактировать

После долгого возни и пробуя разные ключи, я нашел комбинацию, которая работает с регулярными выражениями типа \p{block...} и \N{U+xxxx}.

 perl -CS -pe 's/[^[:ascii:]\p{block:emoticons}\N{U+2639}-\N{U+263B}]//g'

Обратите внимание, что ваш текст должен быть в UTF-8, чтобы это работало (по крайней мере, на моей установке Cygwin).

Другие вопросы по тегам