使用 Python 删除控制字符

问题描述

我有一个处理命令输出的脚本(aws help cli 命令)。

我逐行遍历输出,直到遇到文本“AVAILABLE COMMANDS”时才开始实际解析,此时我将标志设置为 true 并开始对每一行进行进一步处理。>

我的工作正常 - 但是在 Ubuntu 上我们遇到了一个问题: CLI 以我以前从未见过的方式突出显示文本:

输出很长,所以我已经找到了有问题的特定行 - 见下文:

># aws ec2 help | egrep '^A'
>AVAILABLE COMMANDS
># aws ec2 help | egrep '^A' | cat -vet
>A^HAV^HVA^HAI^HIL^HLA^HAB^HBL^HLE^HE C^HCO^HOM^HMM^HMA^HAN^HND^HDS^HS$

我之前没有看到的是,每个突出显示的字母都是 X^HX 格式。 我想应用 X^HX --> X 类型的简单转换(对于所有 a-zA-Z)。

到目前为止我尝试了什么: 好吧,我的解决方法是这样的 - 首先我删除这样的控制字符:

String = re.sub(r'[\x00-\x1f\x7f-\x9f]','',String)

但我仍然必须搜索“AAVVAAIILLAABBLLEE”,这完全是丑陋的。我考虑使用进一步的正则表达式将双打转换为单打,但这会捕获真正的双打并变得混乱。

我开始编写一个函数,在构建的字母字符列表中进行迭代以按所述进行翻译,并且我使用 hexdump 试图找出相关控制字符的确切 \x 代码,但无法使其工作 -我可以删除 H 但不能删除 ^。

我真的不想使用任何额外的模块,因为我想让人们无需安装额外的东西就可以使用它。总之,我有一个非常难看的解决方法,但我相信有人必须知道一种快速简单的方法来进行这种翻译。奇怪的是它似乎只出现在 Ubuntu 上。

解决方法

在进一步研究之后,我能够制定一个解决方案:

from string import ascii_lowercase
from string import ascii_uppercase


def RemoveUbuntuHighlighting(String):
        for Char in ascii_uppercase + ascii_lowercase:
                Match = Char + '\x08' + Char
                String = re.sub(Match,Char,String)
        return(String)

看到格式 (X\x08X) 中突出显示的字符,我仍然有点困惑,这种排列似乎确实不必要地重复了相同的信息。

我要向不熟悉阅读十六进制代码的人建议的另一件事是,每对十六进制都根据它们的出现顺序进行交换。

,

一个更简单、更可靠的修复方法是替换任何字符的退格和副本。

我还使用相同的机制(字符、退格、下划线)处理下划线。

<script src="https://cdn.jsdelivr.net/npm/three@0.126.1/build/three.js"></script>

演示:https://ideone.com/yzwd2V

当输出到行式打印机时,这种突出显示是标准的;退格并再次打印相同的字符会增加色素沉着以产生粗体。(退格和打印下划线会产生下划线。)

可能 AWS CLI 可以配置为通过将 String = re.sub(r'(.)\x08(\1|_)',r'\1',String) 变量设置为类似 TERM 的内容来禁用此功能。还有一个实用程序 col 可以删除这种格式(尝试 dumb;也可以参见 col-b)。虽然也许真正最好的解决方案是colcrt AWS Python 代码并在本地提取帮助消息。