예를 들어, 사용자가 를 입력 foofoo\b\b\bbar
하고 Enter 키를 누르면 대신 var
같음을 얻습니다 . 예, 사용자는 삭제 기능을 상실하므로 삭제하려면 다른 바로가기를 사용해야 합니다. 아니면 적어도 그 반대입니다. 일반적인 백스페이스(눌림)는 수정자를 제공하고 백스페이스는 문자 그대로의 백스페이스를 제공합니다.foofoo\b\b\bbar
foobar
foobar
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)는 다음을 제외하고 허용됩니다.
- ^C(ASCII 03 ETX)
- ^J(ASCII 0A LF)
- ^M(ASCII 0D CR)
- ^Z(ASCII 1A 하위)
- ^\(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
실제로 바이트 값을 "참조"합니다.