Как удалить 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-последовательности можно было игнорировать?

0 ответов

Другие вопросы по тегам