Как удалить escape-последовательности при чтении из байта stdin/pipe
При чтении из stdin
есть нормальный ASCII, может быть, какой-то utf-8, но есть и escape-последовательности. например, когда кто-то нажал клавишу "Стрелка вверх" на клавиатуре.
Как я реагирую на букву "А", но только когда она не является частью escape-последовательности, такой как "Esc[AD;"? Сначала удалив все escape-последовательности! Как я могу это сделать?
Может быть, есть правило о том, как долго выполняются escape-последовательности? Может быть, какой-нибудь вывод / файл terminfo имеет все известные escape-последовательности? Никогда не нашел один из них?
Один из многих примеров, которые не работают:
#/bin/sh
while :; do
#this part is an made up example, case i do more complex stuff with $key
if test x"$key" = xA; then echo 'The Key A was pressed.'; fi
#end of made up example
key="$(/bin/bash -c 'read -s -n1 -t10 key; echo "$key"')"
if [[ "$key" == "q" ]]; then exit; fi
if [[ "$key" == "1" ]]; then sort="fin"; fi
if [[ "$key" == "2" ]]; then sort="size"; fi
if [[ "$key" == "3" ]]; then sort="percent"; fi
done;
Это работает как шарм, но:
Если я нажму любую клавишу, которая вызывает escape-последовательность:
Arrow Up
является некоторой последовательностью, включающей "A", поэтому она печатает "A eas нажат"
Я всегда использую сценарий или программу, поэтому я могу реализовать правила, основанные на предыдущих байтах, но я не могу просто использовать какую-то "команду по конвейеру".
Если вы нашли этот вопрос, но просто ищете одно и то же во время записи в файл или любой другой сценарий использования, когда вы читаете более одного символа за раз, взгляните на этот ответ
Как удалить escape-последовательности из входных данных, чтобы обычные символы внутри escape-последовательности можно было игнорировать?