파일의 백스페이스 키 해석

파일의 백스페이스 키 해석

일반적인 bash 명령을 사용하여 파일/라인의 백스페이스 키를 해석/"실행"하는 방법이 있습니까? 뭔가를 인쇄한 다음 백스페이스를 사용하여 삭제하고 마지막으로 최종 결과를 작성하는 콘솔 프로그램이 있습니다. 내가 정말로 원하는 것은 최종 결과물이다.

echo -e "Foo\b\b\bBar" | what_goes_here > test.log

내 test.log에는 "Bar"만 포함되어야 합니다. 이 문제에 대한 한 가지 문제는 실제로 인쇄되는 것으로 간주될 때까지 얼마나 많은 텍스트를 버퍼링해야 하는지입니다. 제 경우에는 "라인 버퍼링된" 인터프리터이면 충분합니다.

대부분의 유틸리티에는 처음에 이러한 문자를 인쇄하지 않는 스위치가 있습니다. 하지만 현재 사용중인 유틸리티에는 그런 스위치가 없습니다 ...

답변1

col -b목적 은 다음과 같습니다 .

$ printf 'a\bb\n' | col -b | od -tc
0000000   b  \n
0000002

$ printf 'aaa\b\b\bbb\n' | col -b | od -tc
0000000   b   b   a  \n
0000004

이에 상응하는 sed것은 다음과 같습니다.

bs=$(printf '\b')
sed "s/^[^$bs]*/&\
\
/;:1
s/\n.\{0,1\}\(.*\n\)\([^$bs]\)/\2\
\1/;s/\(.\{0,1\}\)\n\(.*\n\)$bs/\
\1\2/;t1
s/\n//g"

실제 텔레타이프(tty) 시대로 거슬러 올라가면 이 시퀀스는 때때로 굵은 글씨 ( 자체 입력), 밑줄 ( ) 또는 취소선( )을 의미 x\bx하는 것으로 나타났습니다 .xxx\b__\bxxx\b--\bx

이러한 문제를 처리하는 데 유용한 또 다른 명령은 colcrt명령입니다.

$ printf '_\bfo\b_o\b_ bar b\b-a\b-z\b-\n' | colcrt
foo bar baz
---

\b_또 다른 옵션은 및 \b-U+0332와 U+0336 문자를 결합하여 유니코드로 변환하는 것입니다 .

이는 유니코드 로케일 및 zsh, ksh93또는 을 가정합니다 bash.

$ printf 'f\b_o\b_o\b_ bar b\b-a\b-z\b-\n' | sed $'s/\b_/\u0332/g;s/\b-/\u0336/g'
f̲o̲o̲ bar b̶a̶z̶

(파이프 colcrtcol -b핸들 x\bx도 굵게 표시됩니다).

답변2

노력하다sed

용도로 사용되는 경우ksh93/zsh/bash

printf "Foo\b\b\bBar\n" | sed -e :a -e "s/.\{0,1\}"$'\b'"//;ta" > test.log

또는 더 휴대 가능

printf "Foo\b\b\bBar\n" | sed -e :a -e "s/.\{0,1\}$(printf "\b")//;ta" > test.log

또는 GNU sed:

printf "Foo\b\b\bBar\n" | gsed -re ":a;s/.?\x08//;ta" > test.log

참고: 이 방법은 '\b'를 백스페이스가 아닌 뒤로 지우기로 처리하므로 \b 뒤의 문자 수가 \b의 수보다 적으면 차이가 발생합니다. (@StephaneChazelas에게 감사드립니다)

관련 정보