(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 파일( )을 사용하여 새( ) 에칭 화면 세션이 시작됩니다 . 거기에서 화면 창에서 인라인 스크립트를 실행하고 스크롤백 크기를 늘리고(여기서는 출력이 한 화면에 맞지만) 입력 파일을 화면 창에 덤프한 다음 출력으로 다시 스크롤하는 것을 포함하여 덤프 화면 내용을 호출합니다. 파일.D
c
/dev/null
sh
hardcopy -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 문자열( $'...'
예: 지원)을 사용하여 이스케이프된 문자를 인코딩하는 것입니다.bash
zsh
각 ^[[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
도움이 되길 바랍니다