리디렉션된 출력에 이스케이프 문자 적용

리디렉션된 출력에 이스케이프 문자 적용

많은 이스케이프 문자(예: 커서를 한 줄 위로 이동시키는 "Esc[1A")를 인쇄하고 출력을 로그 파일로 리디렉션하는 프로그램을 실행 중입니다. 리디렉션 없이 프로그램을 실행하면 최종 출력은 다음과 같습니다.

256 lines processed.

그러나 로그 파일로 리디렉션하면 파일은 다음과 같이 표시됩니다.

Processing line 1...
Esc[1AProcessing line 2...
Esc[1AProcessing line 3...
...
Esc[1AProcessing line 256...
Esc[1A256 lines processed.

터미널에서 "Esc[1A" 문자는 커서에게 뒤로 돌아가서 각 연속 라인이 마지막 라인을 덮어쓰고 마지막 라인만 표시되도록 지시합니다.

리디렉션 없이 로그 파일이 프로그램의 최종 출력과 똑같이 나타나기를 원합니다. 이스케이프된 문자를 필터링 하기 위해 출력을 파이프하는 것이 가능하다는 것을 알고 있지만 col -bp실제로는적용하다내 로그 파일이 관련 없는 수천 줄로 끝나지 않도록 말이죠. 이 목표를 어떻게 달성할 수 있나요?

답변1

읽을 때 이러한 이스케이프 문자를 지워야 합니다. 터미널이 수행하는 작업을 수행하고 덮어쓰십시오.

이것은 설명하는 출력을 시뮬레이션합니다 seq.

seq -s "
$(printf '\033[A')" 10

escape 을 해석하는 터미널에 쓰는 경우에만 인쇄되는 것으로 나타납니다 10. 그러나 귀하의 질문에서 지적했듯이 실제로는 이 모든 숫자를 하나씩 인쇄하고 있습니다. 그러나 sed출력을 다음과 같이 필터링하면:

seq -s "
$(printf '\033[A')" 10 |
sed -e :n -e "\$!N;s/.*$(printf '\033\[A')//;tn"

...그것진짜인쇄되는 이유는 10입력 sed의 다음 줄을 계속해서 읽어 s///패턴 공간의 선두부터 마지막 ​​발생까지 모든 것을 교체하기 때문입니다.단추탈출하다. 성공할 때마다 다시 시도하기 :n위해 태그로 다시 분기됩니다 t.

관련 정보