표시 형식을 유지하면서 이스케이프 시퀀스를 텍스트로 변환하는 방법은 무엇입니까?

표시 형식을 유지하면서 이스케이프 시퀀스를 텍스트로 변환하는 방법은 무엇입니까?

(ANSI?) 이스케이프 시퀀스가 ​​포함된 텍스트 파일이 있습니다.

원본 파일

cat파일을 입력 하면 형식화된 출력이 표시됩니다.

형식화된 출력

제어 코드는 제거되지만 형식은 유지되도록 텍스트 파일의 출력을 새 파일로 저장/파이프하려면 어떻게 해야 합니까?

즉, 예상되는 표시 형식을 유지하면서 파일 내용을 새 파일로 변환/내보내고 싶습니다(예: less -r <file>.

출력을 기록하고 이메일 알림으로 보낼 수 있도록 자동화된 방법이 필요합니다.

다음은 위 스크린샷에 있는 파일의 Base64 출력입니다( base64 -d디코딩에 사용됨).

G1tIG1syShtbMTsxSA0KG1s0OzRIICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSURFTlRJ
QUwgSU5GT1JNQVRJT04bW0sbWzU7NEgbW0sbWzY7NEgbW0sbWzc7NEhUaGlzIHdvcmsgY29udGFp
bnMgdmFsdWFibGUsIGNvbmZpZGVudGlhbCwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLhtb
SxtbODs0SERpc2Nsb3N1cmUsIHVzZSwgb3IgcmVwcm9kdWN0aW9uIGlzIGdvdmVybmVkIGJ5IHlv
dXIgTGljZW5zZSBBZ3JlZW1lbnQuG1tLG1sxMDs0SBtbSxtbMTE7NEhUaGlzIHVucHVibGlzaGVk
IHdvcmsgaXMgcHJvdGVjdGVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIGFuZBtb
SxtbMTI7NEhvdGhlciBDb3VudHJpZXMuICBUaGUgd29yayB3YXMgY3JlYXRlZCBpbiAxOTg4IGFu
ZCByZXZpc2VkIGluIDE5OTQuICAbW0sbWzEzOzRISWYgcHVibGljYXRpb24gb2NjdXJzLCB0aGUg
Zm9sbG93aW5nIG5vdGljZSBzaGFsbCBhcHBseTobW0sbWzE0OzRIG1tLG1sxNTs0SBtbSxtbMTY7
NEggICBDb3B5cmlnaHQgMTk4OCwxOTk0LiBBbGwgcmlnaHRzIHJlc2VydmVkLhtbSxtbMTc7NEgb
W0sbWzE4OzRIG1tLG1sxOTs0SFRoaXMgQ29weXJpZ2h0IG5vdGljZSBhbmQgb3RoZXIgY29weXJp
Z2h0IG5vdGljZXMgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUbW0sbWzIwOzRIcmVhZGFibGUgY29w
aWVzIG11c3QgYmUgcmVwcm9kdWNlZCBvbiBhbGwgYXV0aG9yaXplZCBjb3BpZXMuG1tLG1syMTs0
SBtbSxtbMjI7NEhUaGlzIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsuG1tLDQo=

답변1

가장 좋은 방법은 터미널 에뮬레이터가 이러한 시퀀스를 해석하고 결과의 텍스트 부분을 덤프하도록 지시하는 것입니다.

screen스크립트에서 쉽게 상호 작용할 수 있는 터미널 에뮬레이터 중 하나입니다. 다음을 수행할 수 있습니다.

INPUT=file.txt OUTPUT=output.txt screen -Dmc /dev/null sh -c '
  screen -X scrollback 100000
  cat < "$INPUT"
  screen -X hardcopy -h "$OUTPUT"'

-m그러면 빈 onfig 파일( )을 사용하여 새( ) 에칭 화면 세션이 시작됩니다 . 거기에서 화면 창에서 인라인 스크립트를 실행하고 스크롤백 크기를 늘리고(여기서는 출력이 한 화면에 맞지만) 입력 파일을 화면 창에 덤프한 다음 출력으로 다시 스크롤하는 것을 포함하여 덤프 화면 내용을 호출합니다. 파일.Dc/dev/nullshhardcopy -h

답변2

이 파일에는 많은 내용이 포함되어 있습니다.이스케이프 시퀀스(문자열은 ^[이스케이프 문자입니다):

  • ^[[2J, 화면을 지웁니다.

  • ^[[H, 커서를 화면 상단으로 이동합니다.

  • ^[[x;yH, 위치로 커서를 이동합니다 (x,y).

    이는 기본적으로 화면에서 텍스트 위치의 절대 위치 지정을 사용하여 파일의 위치가 지정됨을 의미합니다.

  • ^[[K줄 끝까지 지웁니다.

파일에는 제거할 수 있는 일부 캐리지 리턴도 포함되어 있습니다.

대부분을 제거하도록 선택할 수 있지만 (x,y)단순화를 위해 "이동" 시퀀스를 단일 개행 문자로 대체합니다. 다행스럽게도 이러한 각 위치 지정은 커서를 한 줄 아래로 이동하고 4개의 공백만큼 들여쓰기만 합니다(텍스트의 "순서가 잘못된" 줄은 없습니다).

sed -e $'s/\e\\[2J//g' \
    -e $'s/\e\\[H//g' \
    -e $'s/\e\\[[[:digit:]]*;[[:digit:]]*H/@    /g' -e 'y/@/\n/' \
    -e $'s/\e\\[K//g' \
    -e $'s/\r//g' file

여기서 대체 방법은 셸에서 C 문자열( $'...'예: 지원)을 사용하여 이스케이프된 문자를 인코딩하는 것입니다.bashzsh

^[[x;yH시퀀스는 2단계 방식으로 개행 문자와 4개의 들여쓰기 공백으로 대체됩니다. 먼저 @    ( @데이터에 없는 문자)로 대체된 다음 를 @ 사용하여 각 문자가 개행 문자로 대체됩니다 y///. 이는 s///개행 문자를 삽입할 수 없기 때문입니다 (GNU는 sed가능하지만).

cat -v데이터 실행의 출력을 사용하도록 선택할 수도 있습니다 . 이렇게 하면 일부 제어 문자가 명확하게 표시됩니다.

$ cat -v file
^[[H^[[2J^[[1;1H^M
^[[4;4H                          CONFIDENTIAL INFORMATION^[[K^[[5;4H^[[K^[[6;4H^[[K^[[7;4HThis work contains valuable, confidential, and proprietary information.^[[K^[[8;4HDisclosure, use, or reproduction is governed by your License Agreement.^[[K^[[10;4H^[[K^[[11;4HThis unpublished work is protected by the laws of the United States and^[[K^[[12;4Hother Countries.  The work was created in 1988 and revised in 1994.  ^[[K^[[13;4HIf publication occurs, the following notice shall apply:^[[K^[[14;4H^[[K^[[15;4H^[[K^[[16;4H   Copyright 1988,1994. All rights reserved.^[[K^[[17;4H^[[K^[[18;4H^[[K^[[19;4HThis Copyright notice and other copyright notices included in the machine^[[K^[[20;4Hreadable copies must be reproduced on all authorized copies.^[[K^[[21;4H^[[K^[[22;4HThis is a registered trademark.^[[K^M

여기서는 다음 sed명령을 사용할 수 있습니다.

cat -v file |
sed -e 's/\^\[\[2J//g' \
    -e 's/\^\[\[H//g' \
    -e 's/\^\[\[[[:digit:]]*;[[:digit:]]*H/@    /g' -e 'y/@/\n/' \
    -e 's/\^\[\[K//g' \
    -e 's/\^M//g'

-v이 옵션 cat은 표준이 아니지만 이를 지원하는 구현의 출력은 cat일관성이 있는 것으로 보입니다 .

일부 시스템에서는 이 vis유틸리티를 대신 사용할 수 있지만 cat -v제어 문자의 다른 가시적 표현이 생성됩니다.

답변3

삭제 옵션과 함께 truncate 명령을 사용하는 간단한 방법입니다. \033은 이스케이프 문자를 나타냅니다.

$cat your_filename|tr -d \033 > save_filename

다음 명령을 사용하여 모든 제어 문자를 제거합니다.

$cat your_filename|tr -d [:cntrl:] > save_filename



도움이 되길 바랍니다

관련 정보