로그 파일에서 BS 및 ESC 제거

로그 파일에서 BS 및 ESC 제거

script명령을 사용하여 입력한 키 입력을 기록하거나 기록 모드를 활성화할 때 마다 screen모든 BS(백스페이스) 및 ESC(esc 키) 키 입력도 파일에 포함됩니다. 예를 들어: cd ~/foo/tpBSBStmp.

마지막으로 기록된 명령이 파일에 포함되도록 파일에서 BS 또는 ESC를 자동으로 제거하는 방법이 있습니까 cd ~/foo/tmp?

그건 그렇고, 이는 Putty의 로깅 기능에서도 발생합니다.

나는 원하지 않는 문자를 제거하는 스크립트나 동일한 작업을 수행하는 다른 명령에도 열려 있습니다.

답변1

맨페이지에 설명된 대로 의 출력에는 script항상 줄 바꿈, 백스페이스 및 ANSI 이스케이프 시퀀스가 ​​포함됩니다. 이러한 모든 항목을 올바르게 표시할 수 있는 프로그램의 예는 cat및 입니다 more. 녹음할 때와 똑같은 타이프스크립트가 표시 cat typescript됩니다 .more typescript

여전히 타이프스크립트를 정리하고 싶다면 살펴보세요.이것스크립트. 이것은 제가 얼마 전에 우연히 발견한 Perl 스크립트입니다. 특히 script.

실행하여 사용해 보세요.script-declutter myTypescript > cleanTypescript

편집: 답변과 실제로 관련이 없지만 관심이 있을 수 있습니다.학기 기록. 터미널 세션에 대한 깔끔하고 독립적인 HTML 및 Javascript 표현을 생성하므로 누구나 TypeScript 작업 방법을 몰라도 이를 볼 수 있습니다. 그들에게 필요한 것은 웹 브라우저뿐입니다.

답변2

-vte인수를 사용하면 cat터미널 코드가 이스케이프됩니다.

예를 들어

cat -vte myfile

답변3

링크가 script-declutter작동하지 않지만 다음 페이지에 표시됩니다.웹 페이지:

#!/usr/bin/perl -wp

# clean up control characters and other non-text detritus that shows up
# when you run the "script" command.

BEGIN {
# xterm titlebar escape sequence
$xtermesc = "\x1b\x5d\x30\x3b";

# the occurence of a backspace event (e.g. cntrl H, cntrol W, or cntrl U)
$backspaceevent = "\x1b\\\x5b\x4b"; # note escaping of third character

# ANSI color escape sequence
$ansiesc = qr/\x1b\[[\d;]*?m/;

# technically, this is arrow-right. For some reason, being used against
# very long backspace jobs. I don't fully understand this, as evidenced
# by the fact that is off by one sometimes.
$bizarrebs = qr/\x1b\[C/;

# used as part of the xterm titlebar mechanism, or when
# a bell sounds, which might happen when you backspace too much.
$bell = "\x07"; # could use \a

$cr = "\x0d"; # could use \r

$backspace = "\x08"; # could use \b
}

s/$xtermesc.+?$bell//g;
s/[$cr$bell]//g;
s/${backspaceevent}//g;
s/$ansiesc//g;
while (s/(.)(?=$backspace)//) { s/$backspace//; } # frickin' sweet
# For every ^H delete the character immediately left of it, then delete the ^H.
# Perl's RE's aren't R, so I wonder if I could do this in one expression.
while (s/(..)(?=$bizarrebs)//) { s/$bizarrebs//; }

# notes
# ^[[7P has been spotted. Based on http://www.google.com/codesearch/p?hl=en#4qbG402gtc0/myScreen.C&q="[7P" it appears to be a numbered cursor jump, moving 7 characters (not sure if left or right).

다른 예제보다 조금 더 복잡하지만 몇 가지 참고 사항이 순서대로 나와 있습니다.

  • Bash 라인 편집에 사용되는 커서 왼쪽 이스케이프 시퀀스를 설명합니다(부분: 작성자는 텍스트에서 커서를 이동하는 실제 사용이 아니라 백스페이스 키와 동일한 방식으로 사용된다고 생각하는 것 같습니다).아니요수정됨).
  • yum일정에 사용되는 포함된 캐리지 리턴은 고려되지 않습니다 .
  • 제거되는 이스케이프 시퀀스의 개념은 SGR 이스케이프(로 끝나는 m)로 제한되며 무시됩니다.모델h또는 로 끝납니다 l.

마지막 두 작업을 수행하지만 여전히 커서를 왼쪽으로 이동하지 않는 (더 짧은) 스크립트의 경우 이전 질문에 대한 내 답변을 참조하세요.

화면의 "부분"을 자주 업데이트하여 로그 파일을 복잡하게 만드는 콘솔 프로그램의 출력을 올바르게 기록하려면 어떻게 해야 합니까?

관련 정보