В mIRC, если кто не знает — IRC-клиент под Windows такой, были впервые реализованы контрольные ASCII-коды для выделения текста в чате. Например, текст находящийся между 0x02 символами будет выделен жирным шрифтом. Среди таких контрольных кодов имеется 0x03, который позволяет указать после него параметр — число, от 0 до 15, а через запятую ещё раз число от 0 до 15. Как можно догадаться, это цвет.
И так, 0x03, затем число 4, запятая, затем число 1, текст и снова 0x03. Таким образом, текст помещенный внутри такой конструкции будет написан красным цветом на чёрном фоне. Вот такая загогулина.
Задача: реализовать удаление всех контрольных кодов из текста. Все контрольные коды удаляются просто — удаляются из текста. :)
Сделать нормально вырезку цветов не могу, помогите пожалуйста.
Допустимый формат может быть любой: 0x03 и затем за ним может следовать число: 4, 04, 4 плюс запятая (тоже должна удаляться), 04 плюс запятая (удаляется), а после запятой опять же могут быть, но не обязательно указаны всё те же цвета 4, 04 с ноликом или без.
4,4
4,04
4,
04,
04,4
04,04
Эвон как... И все эти варианты для удаления нужно учесть.
strip_mirc_control_ascii() {
raw=${raw//$'\x02'/}
local mirc_colours=({00..15},{00..15} {00..15},{0..15} {0..15},{00..15} {00..15}, {0..15}, {00..15} {0..15})
for c in "${mirc_colours[@]}"; do
raw=${raw//$'\x03'$c/}
done
raw=${raw//$'\x03'/}
raw=${raw//$'\x09'/}
raw=${raw//$'\x13'/}
raw=${raw//$'\x0f'/}
raw=${raw//$'\x15'/}
raw=${raw//$'\x1f'/}
raw=${raw//$'\x16'/}
}
Проходиться циклом по всем цветам не вариант, это долго.
# mirc_colours=({0..15} {00..15} {0..15}, {00..15}, {00..15},{0..15} {0..15},{00..15} {00..15},{00..15})
# printf '%s\n' ${mirc_colours[@]} | sort | uniq | wc -l
628
628, Карл! Вариантов цветов...
Нужно учесть их все и удалить, если перед ними стоит 0x03.
HALP!!1