일반적인 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
하는 것으로 나타났습니다 .x
x
x\b_
_\bx
x
x̲
x\b-
-\bx
x̶
이러한 문제를 처리하는 데 유용한 또 다른 명령은 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̶
(파이프 colcrt
나 col -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에게 감사드립니다)