如何从变量中去除 ANSI 转义序列?

2023-12-01

奇怪的问题。当我在 Bash 中设置变量以显示为某种颜色时,我不知道如何重置它。这是一个例子:

首先定义颜色代码:

YELLOW=$(tput setaf 3)
RESET=$(tput sgr0)    

现在设置错误消息变量及其颜色部分。

ERROR="File not found: "$YELLOW"Length.db$RESET"

这将变量 ERROR 设置为从最终将显示在终端上的函数返回的错误消息。除文件名外,错误将全部显示为白色。文件名以黄色突出显示给用户。

除非使用 rsyslog 进行记录,否则这非常有效。当错误消息被记录时,它会显示如下:

找不到文件:#033[33mLength.db#033(B#033[m

这显然使得日志文件非常难以阅读。起初我想我可以在输出到终端后但在记录之前立即使用 sed 处理错误消息,但没有任何内容可以搜索和替换。即,我想我可以使用 sed 来做类似的事情:

ERROR=$(echo "$ERROR" | sed -r 's%\#033\[33m%%')

但是当您回显变量时,这些字符不存在(这是有道理的,因为您在终端上看不到它)。所以我被困住了。我不知道如何在设置变量后重置它的颜色。我还尝试使用 $RESET 以某种方式逆转该过程,但也许我的语法错误或其他原因。


你几乎已经拥有了。试试这个:

ERROR=$(echo "$ERROR" | sed 's%\o033\[33m%%g')

但请注意,使用\oNNN中的转义序列sed是 GNU 扩展,因此不符合 POSIX 标准。如果这是一个问题,您应该能够做更多类似的事情:

ERROR=$(echo "$ERROR" | sed 's%'$(echo -en "\033")'\[33m%%g')

显然,这仅适用于该一种特定颜色(黄色),以及要删除的正则表达式any转义序列(例如其他颜色、背景颜色、光标定位等)将是稍微复杂一些.

另请注意,-r不是必需的,因为这里没有使用扩展正则表达式语法。我猜你已经知道了,并且你刚刚包括了-r出于习惯,但为了清楚起见,我还是提到了它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从变量中去除 ANSI 转义序列? 的相关文章

随机推荐

  • 检查是否安装了VLC

    我从 C 应用程序调用 vlc 来播放视频 我需要一种方法来持续检查 VLC 是否已安装 我已尝试检查注册表项 但根据您的 Windows 版本或体系结构 它们似乎不一致或不可靠 有人有什么建议 建议吗 我想说你在尝试检测这一点时做了不必要
  • Javascript 点击事件触发两次,即使使用 stopPropagation

    我有一组这样的项目
  • 如何从 Gitlab CD 中的应用程序存储库链接部署脚本/存储库?

    假设您有 Repo A与通用应用程序 Repo B使用 Ansible 部署脚本 在 RepoA CI CD 运行程序中 我想从 Repo B 运行 Ansible 脚本 最好 最简单的方法是什么 我正在尝试的是仅为 RepoB 创建一个额
  • 跨多个 Windows 10 虚拟桌面的持久窗口?

    我有带有多个窗口的 C WPF 程序 我添加了对 Windows 10 桌面的支持 但用户希望在桌面之间移动时某些窗口保留在屏幕上 例如 如果在第一个桌面上打开窗口 A 并且他们翻转到第二个桌面 他们希望窗口 A 保留在新桌面上的相同位置
  • 在javascript中快速合并许多连续的多边形

    有谁知道合并数千个连续多边形的方法 我一直在我的原型中使用 turf 的 union 函数来执行此操作 但随着多边形列表的增加 所需的时间变得太慢 我希望 瞄准一个需要亚第二次的解决方案 我就是这样做的 const turfUnion re
  • 理解 Swift 中的单例

    我正在尝试在 SWIFT 中创建一个单例 这就是我到目前为止所做的 class Global class var sharedInstance Global struct singleton static let instance Glob
  • 每n个点求和

    我有一个向量 我需要对每个向量求和n数字并返回结果 这就是我目前计划做的方式 有更好的方法来做到这一点吗 v 1 100 n 10 sidx seq int from 1 to length v by n eidx c sidx 1 2 l
  • 忽略标准输入中的退格键

    我想制作一个程序 强制用户输入文本 但不允许他删除任何内容 在 C 中执行此操作的简单方法是什么 我唯一拥有的是 c getchar EOF c b 这是行不通的 有任何想法吗 POSIX unix 版本 include
  • ant 的 Findbugs 问题

    查找错误 findbugs Executing findbugs from ant task findbugs Running FindBugs findbugs java lang NoClassDefFoundError org apa
  • 通过 Excel VBA 连接 Citrix 上的 SAP

    我的机器上没有直接安装 SAP 并通过以下链接使用 SAP 窗口 https nedc ctx applications services axa tech intraxa Citrix AccessPlatform auth logged
  • 占位符在页面加载时打开 jQuery UI 自动完成组合框 (IE10)

    我正在使用 jQuery UI 自动完成组合框小部件 当我在组合框中添加占位符时 默认情况下会打开自动完成框 出现这种情况仅适用于 IE10 及更高版本 这是我的代码 create function this wrapper span ad
  • css 动画即使在不同时间开始,也会一起结束

    我有一些相同类型的元素 我希望它们共享相同的 css 动画 但我希望它们在不同的时间开始 结束动画 Codepen 为以下代码 html div class container div class box hidden div div di
  • 用户脚本 addEventListener 似乎没有附加到元素

    我正在尝试将 onclick 事件侦听器附加到现有元素 特别是不是button with a form 这是一个简单的div 通过用户脚本在网页上 然而 据我所知 即使在匿名函数中添加事件侦听器不应与现有用户脚本的超时规则发生冲突 它也不会
  • 如何使用 iOS 读取 CSV 文件

    我必须开发一个 iOS 应用程序 该应用程序可以从域上托管的 CSV 文件读取数据 是否有任何标准 API 可以帮助我做到这一点 我不需要下载 只需读取该文件 因为该文件每两分钟就会更新一次 我建议戴夫 德隆 s CHCSV解析器用于解析的
  • list2env(list, envir = .GlobalEnv) 中的错误:names(x) 必须是与 x 长度相同的字符向量

    在向每个 df 添加新列后 我尝试将数据帧列表取消列出到 R 环境中 我想为所有数据框保留相同的名称 我当前的代码 df list lt list CONCE84 dbf CONCE89 dbf CONCE92 dbf CONCE94 db
  • 从 DynamoDB 中删除大量项目的推荐方法是什么?

    我正在 DynamoDB 中编写一个简单的日志记录服务 我有一个由 user id 哈希值和时间戳 Unix epoch int 范围作为键的日志表 当该服务的用户终止其帐户时 我需要删除表中的所有项目 无论范围值如何 执行此类操作的推荐方
  • 尝试让签名的小程序在浏览器中运行但惨败

    我创建了一个 JApplet 它使用两个外部库 JENA and JUNG 当我从 IDE 运行小程序 使用 eclipse 时 它可以正常工作 我创建了一个 jar 文件 对其进行了签名 因为小程序需要从磁盘读取文本 创建了一个 HTML
  • 警告:odbc_connect():SQL 错误:[Microsoft][ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序

    我已将 Ms Access 数据库连接到 PHP 文件 PHP 文件给出错误 警告 odbc connect SQL 错误 Microsoft ODBC 驱动程序管理器 未找到数据源名称且未指定默认驱动程序 第 3 行 C wamp www
  • 如何在 Visual Studio 中将剪贴板内容交换为当前选择

    有谁知道一个simple如何将剪贴板中当前的内容与当前的鼠标选择交换 假设我的剪贴板有文本Foo in it 在一行代码上public void DoBar I have Bar已选择 我想要一个可以改变的简单组合键DoBar to DoF
  • 如何从变量中去除 ANSI 转义序列?

    奇怪的问题 当我在 Bash 中设置变量以显示为某种颜色时 我不知道如何重置它 这是一个例子 首先定义颜色代码 YELLOW tput setaf 3 RESET tput sgr0 现在设置错误消息变量及其颜色部分 ERROR File