LINUX.ORG.RU

Как удалить mIRC Control ASCII из строки?

 , , mirc


0

1

В 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

★★★★★

Последнее исправление: Spoofing (всего исправлений: 1)

Ответ на: комментарий от beastie

не, у нас на #lor можно установить приветствие !greet <сообщение>, но есть товарисчи которые в сообщение вставляют контрольные коды — их я и хочу вырезать, чтобы моя Вогля не писала на #lor с цветами.

Spoofing ★★★★★
() автор топика
shopt -s extglob
number='[0-9]|0[0-9]|1[0-5]'
raw=${raw//$'\x03'?(@($number)?(,@($number)))/}
shdown
()

sed -e «s/((\003\d{1,2})(,\d{1,2})?|\002|\037|\035|\017)//g»

В принципе тут главное, формат регулярки. В sed не силен :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.