Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过彩色文本进行grep,例如gcc | colorgc | grep regexp_Regex_Perl_Grep - Fatal编程技术网

通过彩色文本进行grep,例如gcc | colorgc | grep regexp

通过彩色文本进行grep,例如gcc | colorgc | grep regexp,regex,perl,grep,Regex,Perl,Grep,在对管道输出进行grep处理时,如何使grep尊重ANSI颜色转义? 我很乐意使用其他东西(perl?)而不是grep 我的用户案例:我想要 gcc foobar.c | colorgcc | grep regexp ls --color | grep filename 可以很好地使用颜色(在unix终端上使用ANSI转义) 我想要的行为测试示例: echo -e "he\e[35mllo\e[00m" world |grep hell ==> he\e[35mllo\e[00m w

在对管道输出进行grep处理时,如何使grep尊重ANSI颜色转义? 我很乐意使用其他东西(perl?)而不是grep

我的用户案例:我想要

 gcc foobar.c | colorgcc | grep regexp
 ls --color | grep filename
可以很好地使用颜色(在unix终端上使用ANSI转义)

我想要的行为测试示例:

echo -e "he\e[35mllo\e[00m" world |grep hell ==> he\e[35mllo\e[00m world 
echo -e "\e[35m removed line\nhello\e[00m" world |grep hell ==> \e[35mhello\e[00m world
echo -e "\e[35m rem\e[1moved line\nhello\e[00m" world | grep hell ==> \e35m\e1mhello\e[00m world
目前,第一行给出空字符串,第二行给出未着色字符串
“hello\e[00m world.”这里\e[35m和\e00m是颜色(属性)修饰符:字母的颜色由格式为\e[P1;P2;.m的最后几个颜色(属性)转义序列决定,其中P1、P2等是数字序列;\e[P1m\e[P2m相当于\e[P1;P2m.\e[0m将颜色设为默认值,并忘记之前的所有\e[…m序列:\e[34m\e[0m相当于\e[0m。有几个独立的属性(粗体、背景颜色、前景颜色/字母);转义序列中的每个数字只影响其中一个。因此\e[1m\e[35m相当于\e[1;35m,但不等于\e[35;1m或\e[35m;然而,\e[34m\e[35m相当于\e][35m因为它们都影响相同的姿态(即字母/前置词的颜色)。

这是一个非常有趣的问题,下面是我的想法。这很难看,但似乎完成了任务:

sed -n '1s/^/\x1b[0m/;H;x;s/\n//;p;s/.*\(\x1b\[[0-9]*m\(;[0-9]*m\)*\).*/\1/;h' |
  grep `sed 's/./\0\\\\(\x1b\\\\[[0-9]*m\\\\(;[0-9]*m\\\\)*\\\\)*/g' <<< hell`
sed-n'1s/^/\x1b[0m/;H;x;s/\n/;p;s/*\(\x1b\[[0-9]*m\(;[0-9]*m\)*\./\1/;H'|
grep`sed's/\0\\\\(\x1b\\\\[[0-9]*m\\\\(;[0-9]*m\\\\)*/g'grep`sed's/\0\\\\(\x1b\\\\[[0-9]*m\\\\\(;[0-9]*m\\\\\\\\\\)*/g'sed-n'1s/^/\x1b[0m/;H;x;s/\n/\s/\p;p\\\\\\\\\\\\\\\[[0-9]*m/]|

>grep`sed's/\0\\\\(\x1b\\\\[[0-9]*m\\\\(;[0-9]*m\\\\)*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\哦,对不起!不,这很好。但是它可以用于任意正则表达式吗?如果我用“egrep”替换最后一个“grep”,它似乎不起作用。如果你用egrep替换grep,那么你可以删除紧跟在
之前的第二个sed命令中的所有反斜杠
。在编辑中添加了此项。请注意,如果您的搜索词是任意正则表达式,则此项将不起作用,因为插入颜色转义可能会更改原始正则表达式的行为。谢谢!这会处理重叠序列:echo-e“\e[35m rem\e[1移动线\nhello\e[00m”世界。不过,确实很酷!我不知道sed的“h”和“h”命令。
$ echo -e "he\e[35mllo\e[00m" world |
> sed -n '1s/^/\x1b[0m/;H;x;s/\n//;p;s/.*\(\x1b\[[0-9]*m\(;[0-9]*m\)*\).*/\1/;h' |
> grep `sed 's/./\0\\\\(\x1b\\\\[[0-9]*m\\\\(;[0-9]*m\\\\)*\\\\)*/g' <<< hell` |
> hexdump -C
00000000  1b 5b 30 6d 68 65 1b 5b  33 35 6d 6c 6c 6f 1b 5b  |.[0mhe.[35mllo.[|
00000010  30 30 6d 20 77 6f 72 6c  64 0a                    |00m world.|
0000001a

$ echo -e "\e[35m removed line\nhello\e[00m" world |
> sed -n '1s/^/\x1b[0m/;H;x;s/\n//;p;s/.*\(\x1b\[[0-9]*m\(;[0-9]*m\)*\).*/\1/;h' |
> grep `sed 's/./\0\\\\(\x1b\\\\[[0-9]*m\\\\(;[0-9]*m\\\\)*\\\\)*/g' <<< hell` |
> hexdump -C
00000000  1b 5b 33 35 6d 68 65 6c  6c 6f 1b 5b 30 30 6d 20  |.[35mhello.[00m |
00000010  77 6f 72 6c 64 0a                                 |world.|
00000016
sed -n '1s/^/\x1b[0m/;H;x;s/\n//;p;s/.*\(\x1b\[[0-9]*m\(;[0-9]*m\)*\).*/\1/;h' |
  egrep `sed 's/./\0(\x1b\\\\[[0-9]*m(;[0-9]*m)*)*/g' <<< hell`