Bash

逐個字元讀取和處理字元串,但允許使用者對輸入進行簡單的行編輯

  • December 30, 2021

我想從終端逐步讀取一行輸入,並允許使用者一些基本的行編輯功能;INS、DEL、RIGHT、LEFT 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

如果您使用 一次讀取一個字元,read -n則必須實現一個鍵序列解析器。您可以使用以下方法建構一個適用於大多數終端的緩慢而骯髒的解決方案:考慮一個功能鍵轉義序列以一個轉義字元開始,並以任意數量的字元繼續,0-9;[]O然後是一個不在此集中的最終字元。

讀取輸入的更好方法是使用適當的輸入庫。Bash 出於自己的目的使用一個(readline)。bind通過使用內置聲明您自己的鍵綁定,您可以獲得一個有限的介面;專門bind -x用於在按鍵時執行 shell 命令。由於這個有限的介面,實現你想要的可能是可能的,但很困難。

Zsh 有自己的輸入庫zle。它的界面比 bash 的要豐富得多。使用 zle,您可以定義任意鍵映射,並且您可以從 shell 程式碼中更多地訪問 zle 的內部。用於zle將 shell 函式分配給 zle 使用者定義的命令(稱為小元件),bindkey創建和填充您自己的鍵盤映射,最後vared使用您選擇的鍵盤映射讀取一行輸入。

引用自:https://unix.stackexchange.com/questions/18334