ANSI 转义码的 grep

Ken*_*Y-N 5 grep escape-characters

我已经签出了很多环节上如何grep个别转义字符或文本字符串,但我不能让他们结合起来,找到后台红色ANSI转义序列^[41m,即使键入^[既是Ctrl+V+Ctrl+[和两个文字字符^+[和使用-E-F标志。

我试图找到的原始字节hexdump是:

1b 5b 33 37 6d 1b 5b 34 31 6d 30 2e 30 30 25
Run Code Online (Sandbox Code Playgroud)

这对应于WHITE FOREGROUND RED BACKGROUND 0.00%. 我正在使用Python 的 colorama 包和生成这些代码Fore.WHITE+Back.RED,以防万一有人好奇。

那么,我缺少的秘密是什么?

Fru*_*uit 6

但我就是无法让它们组合起来找到背景红色的 ANSI 转义序列^[41m

如果您使用vim打开此文件,您会知道它不是^[41m,而是^[[41m,其中^[以箭头键为一组导航:

在此处输入图片说明

1bis Escape由单个转义字符表示^[,可以通过Ctrl+ Vfollow by调用Esc^[看起来像 2 个字符,但它不是,它是单一的:

xb@dnxb:~/Downloads/grep$ ascii 1b
ASCII 1/11 is decimal 027, hex 1b, octal 033, bits 00011011: called ^[, ESC
Official name: Escape

xb@dnxb:~/Downloads/grep$
Run Code Online (Sandbox Code Playgroud)

这样做(使用Ctrl+ Vfollow byEsc来创建^[,然后连续输入\[41m):

xb@dnxb:~/Downloads/grep$ hexdump -C /tmp/2
00000000  1b 5b 33 37 6d 1b 5b 34  31 6d 30 2e 30 30 25 0a  |.[37m.[41m0.00%.|
00000010
xb@dnxb:~/Downloads/grep$ \grep '^[\[41m' /tmp/2
0.00%
xb@dnxb:~/Downloads/grep$ \grep '^[\[41m' /tmp/2 | hexdump -C
00000000  1b 5b 33 37 6d 1b 5b 34  31 6d 30 2e 30 30 25 0a  |.[37m.[41m0.00%.|
00000010
xb@dnxb:~/Downloads/grep$ 
Run Code Online (Sandbox Code Playgroud)

确保按前缀转义 grep\以避免其别名--color影响:

在此处输入图片说明

[选择]:

  1. \grep -P '\e\[41m' (信用:OP的评论)
  2. \grep '^[\[41m', 使用Ctrl+V跟随Ctrl+[来创建^[. 当我的键盘中的退格键不是 0x08 时很有用,但我可以使用Ctrl+ Vfollow by Ctrl+ H(^H get from ascii 08) 来生成它。

  • 谢谢你 - 我看到问题主要是我没有意识到来自`^[`和文字`[`的`[`。从我最初的帖子开始,我还发现 `\grep -P "\e\[41m"` 是一种替代方法。 (2认同)
  • `\grep $'^\x1b\[41m'` 无需 Perl 正则表达式或插入文字转义序列即可工作,因此它对编辑器友好并且适用于 Mac。 (2认同)