使用bash从文本文件中删除ANSI颜色代码

25

我有一个Bash脚本,它可以运行并输出到文本文件,但其中包含的颜色代码也会被输出,我想知道如何从该文件中删除这些代码。

^[[38;1;32mHello^[[39m
^[[38;1;31mUser^[[39m

所以我只想保留“Hello”和“User”


使用Python的相关答案:https://dev59.com/BmUq5IYBdhLWcg3wNtyB - GreyCat
2
重复:http://unix.stackexchange.com/questions/4527/program-that-passes-stdin-to-stdout-with-color-codes-stripped - GreyCat
4个回答

19
sed -r "s/\x1B\[(([0-9]{1,2})?(;)?([0-9]{1,2})?)?[m,K,H,f,J]//g" file_name

这个命令可以去除文件中的特殊字符和颜色代码。

这些是一些 ANSI 代码: ESC[#;#H 或 ESC[#;#f 可以将光标移动到第 # 行、第 # 列 ESC[2J 可以清空屏幕并将光标放回原点 ESC[K 可以清除至行尾。

注意,在清空代码中,既没有数字也没有分号 ;

同意以下评论: 如果数字超过两位数,请使用此代码:

sed -r "s/\x1B\[(([0-9]+)(;[0-9]+)*)?[m,K,H,f,J]//g" filename

代码中的数字部分数量不确定,设置颜色的数字可以有多达5个且不重复。设置其他功能(例如Linux控制台蜂鸣频率)的代码可以连续超过2个数字。 - Jasen
我同意你的看法,Jasen :-) - sandy_1111
4
[m,K,H,f,J]中的逗号是多余的,对吗? - Tuetschek

10

我的解决方案:

... | sed $'s/\e\\[[0-9;:]*[a-zA-Z]//g'

冒号存在是为了支持一些旧终端类型的转义。

"$"符号有什么作用? - fstamour
啊,这是为了插值'\e':https://dev59.com/22ct5IYBdhLWcg3wmOjg - fstamour
Bash支持类C语言的转义,使用$'...'。 - Wiimm
已经测试成功,使用以下命令:echo $'\033'"[38;1;32m你好"$'\033'"[39m"(从Jasen的评论中获取 在此处 - Shadi

1

这解决了问题吗?

$ echo "^[[38;1;32mHello^[[39m" | sed -e 's/\^\[\[[0-9;]\{2,\}m//g'
Hello

加油!!


不,它不是这样的,因为“^ [”代表ASCII转义字符(控制- [,代码27)。 - Armali
@Armali:不明白你的观点。根据原帖的要求,它应该可以工作。你能否发一个例子说明它不起作用的情况?干杯! - MacUsers
是的... TERM=xterm tput setf 1|sed -e 's/\^\[\[[0-9;]\{2,\}m//g'|hexdump -C - Armali
我认为这不是楼主想要的。 - MacUsers
3
我认为你的意思是 echo $'\033'"[38;1;32mHello"$'\033'"[39m" | sed -e 's/\^\[\[[0-9;]\{2,\}m//g'(你写的无法成功粘贴),但它并不起作用。 - Jasen

0

解决方案

大多数投票的答案对我来说并没有立即生效。它需要进行一些小的调整。

操作步骤:

  • 在bash shell中运行以下命令,或将以下代码块添加到您现有的别名列表中,以便将来可以重用decolor别名。
## Decolor ANSI Colored Output
# example: (see preview in VSCode editor)
# >>> cat <filepath> | decolor | code -
alias decolor.styles='sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?[m,K,H,f,J]//gm"'
alias decolor.reset='sed -E "s/\x1B\([A-Z]{1}(\x1B\[[m,K,H,f,J])?//gm"'
alias decolor='decolor.styles | decolor.reset'

使用方法:

cat coloredtext.txt | decolor

输出:

PRESENT: /somepath/somefile_a.csv
PRESENT: /somepath/somefile_b.csv

虚拟数据

# File Name: coloredtext.txt
# [1m[32mPRESENT:(B[m [32m/somepath/somefile_a.csv(B[m
# [1m[32mPRESENT:(B[m [32m/somepath/somefile_b.csv(B[m
\x1B[1m\x1B[32mPRESENT:\x1B(B\x1B[m \x1B[32m/somepath/somefile_a.csv\x1B(B\x1B[m
\x1B[1m\x1B[32mPRESENT:\x1B(B\x1B[m \x1B[32m/somepath/somefile_b.csv\x1B(B\x1B[m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接