У меня есть результаты тестов на соответствие Kubernetes.
\u001b[90mtest/e2e/common/network/framework.go:23\u001b[0m
Granular Checks: Pods
\u001b[90mtest/e2e/common/network/networking.go:32\u001b[0m
should function for intra-pod communication: udp [NodeConformance] [Conformance]
\u001b[90mtest/e2e/framework/framework.go:652\u001b[0m
\u001b[90m------------------------------\u001b[0m
Я хочу прочитать вывод, удалив все escape-последовательности. У меня нет контроля над кодом, поэтому я чувствую себя с помощью cat, less -r, ansifilter и т. д.; даже сед.
Но ничто из этого не помогает мне удалить escape-последовательности. Как я могу их удалить?
Я пробовал это, но на Mac мне не помогло.
Итак, ваш ввод буквально начинается с обратной косой черты, u
, нуля и т. д., а не с escape-символа Юникода \u001b
?
пожалуйста, обновите вопрос, указав некоторые из ваших попыток кодирования, (неправильные) результаты, полученные указанным кодом, и (правильный) ожидаемый результат; также, пожалуйста, разверните свой ответ на комментарий pmf - didn't help me
- ошибка? неправильный ответ? нет ответа? что-то еще?
рассмотрите возможность передачи вывода в xxd
, а затем обновите вопрос результатами; затем мы можем использовать xxd -r
, чтобы воссоздать точный результат в вашей системе.
Единственным решением, которое сработало для меня, был этот фрагмент.
import re
import sys
output_file = sys.argv[1]
print(output_file)
def remove_escapes(text):
# First, replace Unicode escape sequences
text = text.encode('ascii', 'ignore').decode('unicode_escape')
# Then, remove ANSI escape sequences
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
return ansi_escape.sub('', text)
for line in open(output_file):
try:
parsed_line = remove_escapes(line)
except UnicodeDecodeError:
print("UnicodeDecodeError: " + line)
continue
print(parsed_line, end='')
Последовательности CSI (Control Sequence Introducer)
Для команд Control Sequence Introducer, или CSI, заESC
[
(записанным как\e[
или\033[
на нескольких языках программирования) следует любое количество (в том числе отсутствие) «байтов параметров» в диапазоне0x30–0x3F
(ASCII0–9:;<=>?
), а затем любой количество «промежуточных байтов» в диапазоне0x20–0x2F
(ASCII space и!"#$%&'()*+,-./
), затем, наконец, на один «последний байт» в диапазоне0x40–0x7E
(ASCII@A–Z[\]^_`a–z{|}~
).
Таким образом, решение POSIX для удаления этих CSI может быть следующим:
LANG=C awk '{ gsub(/\033\[[0-?]*[ -/]*[@-~]/, ""); print }'
редактировать
Поскольку ESC CSI кажутся экранированными в формате JSON, вы можете использовать:
LANG=C awk '{ gsub(/\\u001[bB]\[[0-?]*[ -/]*[@-~]/, ""); print }'
sed 's/\x1B\[[0-9;]\{1,\}[A-Za-z]//g'
может «обескрасить» свой ввод