Các hexdump cho thấy dấu chấm trong .[16D
thực sự là một nhân vật chạy thoát, \x1b
.
Esc[
nD
là ANSI escape code để xóa n
ký tự. Vì vậy, Esc[16D
yêu cầu thiết bị đầu cuối xóa 16 ký tự, giải thích đầu ra cat
.
Có nhiều cách khác nhau để xóa mã thoát ANSI khỏi một tệp, bằng cách sử dụng lệnh Bash (ví dụ: sử dụng sed
, như trong câu trả lời của Anubhava) hoặc Python. Tuy nhiên, trong trường hợp như thế này, tốt hơn là chạy tệp thông qua trình giả lập thiết bị đầu cuối để giải thích bất kỳ chuỗi điều khiển chỉnh sửa hiện có nào trong tệp, do đó bạn sẽ nhận được kết quả tác giả của tệp dự định sau khi áp dụng các chuỗi chỉnh sửa đó. Quay lại đầu trang
Một cách để làm điều đó trong Python là sử dụng pyte, một mô-đun Python thực hiện một trình mô phỏng thiết bị đầu cuối tương thích VTXXX đơn giản. Bạn có thể dễ dàng cài đặt nó bằng cách sử dụng pip
và đây là tài liệu của nó trên readthedocs.
Đây là một chương trình demo đơn giản diễn giải dữ liệu được đưa ra trong câu hỏi. Nó được viết cho Python 2, nhưng thật dễ dàng để thích nghi với Python 3. pyte
là nhận thức Unicode và lớp Stream chuẩn của nó mong đợi các chuỗi Unicode, nhưng ví dụ này sử dụng ByteStream, vì vậy tôi có thể chuyển nó thành một chuỗi byte đơn giản.
#!/usr/bin/env python
''' pyte VTxxx terminal emulator demo
Interpret a byte string containing text and ANSI/VTxxx control sequences
Code adapted from the demo script in the pyte tutorial at
http://pyte.readthedocs.org/en/latest/tutorial.html#tutorial
Posted to http://stackoverflow.com/a/30571342/4014959
Written by PM 2Ring 2015.06.02
'''
import pyte
#hex dump of data
#00000000 48 45 4c 4c 4f 20 54 48 49 53 20 49 53 20 54 48 |HELLO THIS IS TH|
#00000010 45 20 54 45 53 54 1b 5b 31 36 44 20 20 20 20 20 |E TEST.[16D |
#00000020 20 20 20 20 20 20 20 20 20 20 20 1b 5b 31 36 44 | .[16D|
#00000030 20 20 | |
data = 'HELLO THIS IS THE TEST\x1b[16D \x1b[16D '
#Create a default sized screen that tracks changed lines
screen = pyte.DiffScreen(80, 24)
screen.dirty.clear()
stream = pyte.ByteStream()
stream.attach(screen)
stream.feed(data)
#Get index of last line containing text
last = max(screen.dirty)
#Gather lines, stripping trailing whitespace
lines = [screen.display[i].rstrip() for i in range(last + 1)]
print '\n'.join(lines)
đầu ra
HELLO
hex bãi chứa của đầu ra
00000000 48 45 4c 4c 4f 0a |HELLO.|
Nguồn
2015-06-01 10:37:52
bạn đã thử string.printable? – therealprashant
Tôi tự hỏi tại sao thẻ python ... – 0xc0de
Trên hầu hết các hệ thống * nix, và chắc chắn trên bất kỳ hệ thống GNU nào, cần có lệnh [strings] (http://linux.die.net/man/1/strings) . –