(どのように) `read var`を使ってvarにテキスト\ b(バックスペース)を追加できますか?

(どのように) `read var`を使ってvarにテキスト\ b(バックスペース)を追加できますか?

たとえば、ユーザーが を入力しfoofoo\b\b\bbarて Enter キーを押すと、代わりにvar同じことがわかります。はい、ユーザーは削除機能を失うため、削除するには別のショートカットを使用する必要があります。それとも少なくともその逆です。一般的なバックスペース(押下)は修飾子を提供し、バックスペースは文字通りのバックスペースを提供します。foofoo\b\b\bbarfoobarfoobar

readテキストバックスペースを許可する方法はありますか?

答え1

以下を使用して文字をそのまま入力できますCtrlv

bash-4.2$ read foo
abc^Hfoo
bash-4.2$ printf "%s\n" "$foo" | od -c
0000000   a   b   c  \b   f   o   o  \n
0000010
bash-4.2$ printf "%q\n" "$foo"
$'abc\bfoo'

はい(または端末設定によって同じでなければなりません)^HCtrlv BackspaceCtrlv CtrlH

答え2

\bユーザー入力(バックスラッシュ-b)をバックスペースとして許可するには、次のように置き換えることができますread

read -r var
var=${var//\\b/$'\b'}

ユーザーがバックスペースキーを使用せずに押すことができるようにするには、Ctrl-V端末の消去文字を一時的にオフにします。後で^?/を/\x7fに変更する必要があるかもしれません^H\x08

stty_saved=$(stty -g)
stty erase ""
read var
var=${var//$'\x7f'/$'\b'}
stty "$stty_saved"

バックスペースはまだ^?同じ印刷されますCtrl-V

(バックスペースキーを使用して画面上の文字を削除したいが、まだバックスペースキーと削除された文字を保存したい場合は、手動で実装する必要があります。)

答え3

このスクリプトは以下を除いて許可されます。

  1. ^C(ASCII 03 ETX)
  2. ^J(ASCII 0A LF)
  3. ^M(ASCII 0D CR)
  4. ^Z(ASCII 1Aサブ)
  5. ^\(ASCII 1C FS)

他のすべての制御文字を含みます。

#!/bin/bash

while IFS= read -srn1 a ;do
    [[ "${a+x$a}" = "x" ]] && break
    var=$var$(printf '%s' "$a")
    printf '%s' "$a"
done
printf '\n%s\n' "$var"

CTRLタイプ - バックスペース用ですH

変える:

printf '\n%s\n' "$var"

そして:

printf '%s' "$var" | od -An -tx1

実際にバイト値を「参照」します。

関連情報