逐个字符读取和处理字符串,但允许用户对输入进行简单的行编辑

Pet*_*r.O 5 bash terminal text-processing

我想从终端增量读取一行输入,并允许用户一些基本的行编辑功能;INS, DEL, 右, 左 HOME, END, Backspace

每次修改字符串时,我都想对其进行处理,以对文本文件进行增量正则表达式搜索。

这些编辑键和其他键会生成多个输入字符,这
使得解释输入变得相当困难,例如 C-Left 生成 6 个字符。

有没有一种简单的方法来实现这种逐字符的可编辑输入?
我特别想知道如何在 bash 中执行此操作,因为其余的处理将是 bash .. 其他建议也欢迎..

这是我开始的方式,但它有点失控,有这么多潜在的控制代码......

#!/bin/bash
IFS=$'\n' 
while true ;do
  read -n 1 c
  ((${#c}==0)) && break # Exit the loop. Input length is 0  
                        # ie. The user has pressed Enter
  echo "xx=$(echo -n "$c"|xxd -p)="
  # 1b 5b 32 7e  "INS"
  # 1b 5b 33 7e  "DEL"
  # 1b 5b 43     "RIGHT"
  # 1b 5b 44     "LEFT"
  # 1b 5b 46     "END"
  # 1b 5b 48     "HOME"
  # 7f           "BACKSPACE"
done
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 3

如果您使用 一次读取一个字符read -n,则必须实现一个键序列解析器。您可以使用以下方法构建一个适用于大多数终端的缓慢而肮脏的解决方案:考虑功能键转义序列以转义字符开头,并以任意数量的字符继续,后面跟着0-9;[]O一个不在此集合中的最后一个字符。

读取输入的更好方法是使用适当的输入库。Bash 将其用于其自身目的(readline)。bind通过使用内置声明您自己的键绑定,您可以获得有限的接口;专门用于bind -x在按键时运行 shell 命令。由于接口有限,实现您想要的内容可能是可能的,但很困难。

Zsh 有自己的输入库zle。它的界面比 bash 丰富得多。使用 zle,您可以定义任意键盘映射,并且可以通过 shell 代码更好地访问 zle 的内部结构。用于zle将 shell 函数分配给 zle 用户定义的命令(称为小部件),bindkey创建并填充您自己的键盘映射,最后vared使用您选择的键盘映射读取一行输入。