从stdin / pipe逐字节读取时如何去除转义序列

时间:2018-12-24 04:25:51

标签: shell terminal escaping stdin tput

stdin进行读取时,会使用正常的ASCII,也许是utf-8,但是会出现转义序列。例如当有人按下键盘上的“向上箭头”时。

我如何对字母'A'做出反应,但仅当它不像'Esc [AD;''这样的转义序列的一部分时? 首先剥离所有转义序列! 我该怎么办?


也许有一个关于转义序列有多长的规则?也许某些terminfo输出/文件具有所有已知的转义序列?没找到其中一个?

许多无效的示例之一:

#/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;

它就像一种魅力,但是:

如果我按下任何引起转义序列的键:

  • Arrow Up是包含“ A”的某些序列,因此它会打印“按了A”键。

我一直在使用脚本或程序,因此我可以基于前面的字节来实现规则,但是我不能仅使用一些“管道命令”。

如果您发现了这个问题,但是在写入文件时正在寻找相同的东西,或者您一次读取多个字符的任何其他用例,那么请看一下{ {3}}

如何从输入中删除转义序列,以便可以忽略转义序列内的普通字符?

0 个答案:

没有答案