LINUX.ORG.RU

Найти кол-во символов «побега» в строке

 


0

1

нужно найти в строке кол-во символов escape с кодом \033

Пример:

x="Th\033[42mis i\033[47ms a \033[36mte\033[0mst"
for ((i=0; i<${#x}; i++)); do
	echo -e ${x:$i:1}
	if [ "${x:$i:1}" == "\033" ]; then
	# пробовал в двойных скобках и C скобках
		echo yes
		for ((; ${x:$i:1}!='m'; i++)) do
			:
		done
		let len=len+1
	fi
done

Сформулируй, пожалуйста, хотя бы в трёх предложениях.

Ну а на счёт for - скобки не нужны.

ziemin ★★
()
Ответ на: комментарий от ziemin

Изначально нужно найти длину строки без непечатных символов, т.е. задающих цвет, идущих после символа <escape> с кодом \033. Проблема в том что этот символ очень трудно вытащить из строки, т.к. он служебный. И скобки в for нужны, т.к. используется C-шный синтаксис.

anion155
() автор топика
echo $x | sed 's/\033/\033\n/g' | grep -c '\033'
anonymous
()
x="Th\033[42mis i\033[47ms a \033[36mte\033[0mst"
for ((i=0; i<${#x}; i++)); do
  if [ "${x:$i:4}" == "\033" ]; then
    let len=len+1
  fi
done
anonymous
()
Ответ на: комментарий от anonymous

хмм интересно... Думал bash переведёт «\033» в один символ во время присваивания... Спасибо, буду знать.

anion155
() автор топика
Ответ на: комментарий от anion155

Нашел более элегантное решение в связи с полученными знаниями.

while [[ "$x" =~ ^(.*)033\[[0-9]{1,2}m(.*)$ ]]; do
	x="${BASH_REMATCH[1]:: -1}${BASH_REMATCH[2]}"
done

anion155
() автор топика
Ответ на: комментарий от alozovskoy

так переменная подставляется оболочкой. А если сделать, как у меня, то переменную подцепит let.

anion155
() автор топика

ИМХО, проще вырезать из строки все escape и сравнить длинну с исходной.

#! /bin/bash

x=`echo -e "Th\033[42mis i\033[47ms a \033[36mte\033[0mst"`
y=`tr -d '\033' <<< $x`

echo $(( ${#x} - ${#y} ))
Используются башизмы

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