(어떻게) `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'

예(또는 터미널 설정에 따라 동일해야 함) ^H.Ctrlv 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

이 스크립트(bash)는 다음을 제외하고 허용됩니다.

  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

실제로 바이트 값을 "참조"합니다.

관련 정보