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).