bash中使用正则处理带颜色文本
就在昨天, 我在mohist端上测试minecraftctl新出的listen功能时,发现出现了诡异的一幕, 正则表达式无法匹配到玩家发出的消息
定位问题
在漫长的debug后, 最终将问题定位到了文字颜色上面, 似乎正则表达式不能正确的在不同颜色的文本中匹配. 我逐渐反应过来, bash中的带颜色文本使用的是一种特殊的控制字符,这种字符看起来长这样: \x1b[1;30m
, 要注意的是, 前面的\x1b
是不可见字符, 在经过对照后,此字符代表的是Esc
, 也就是linux中最喜欢的控制字符. 我最开始想通过正则绕过这个问题, 但是转念一想, 我为什么不把它删掉呢?
最终解决方案
于是我设计出了如下的正则表达式, 恰恰好能解决问题
# 用管道传入此命令将颜色控制字符删掉,之后就能正常的使用正则匹配文本了
sed 's/[[:cntrl:]]\[[0-9;]*[mK]//g'