首页 > 解决方案 > 突出显示与正则表达式匹配的文本

问题描述

当我使用agrg选择文本时,它会突出显示选定的文本。

$ echo "First HTML appeared, then CSS, then JavaScript" | rg -N 'HTML|php|CSS|Java(Script)?' 
$ echo "First HTML appeared, then CSS, then JavaScript" | ag --nonumbers 'HTML|php|CSS|Java(Script)?'

但是当我使用 Perl 时,它不会突出显示匹配的文本。

$ echo "First HTML appeared, then CSS, then JavaScript" | perl -ne '/HTML|php|CSS|Java(Script)?/ and print'

在此处输入图像描述

我尝试了以下方法:

echo "First HTML appeared, then CSS, then JavaScript" | perl -ne 'use Term::ANSIColor qw(:constants);/HTML|php|CSS|Java(Script)?/ and print RED, $_'

echo "First HTML appeared, then CSS, then JavaScript" | perl -ne 'use Term::ANSIColor;/HTML|php|CSS|Java(Script)?/ and print color("red"), $_'

它会更改整个文本的颜色,而不是所选文本的颜色。

使用 Perl 搜索时,如何突出显示与 Regex 匹配的文本?

标签: perl

解决方案


您将颜色切换为红色,打印整行,然后保持红色。不好。

您想打印不匹配的文本,将颜色切换为红色,打印匹配的文本,重置颜色,然后根据需要重复。

由于RED并且RESET只是返回由终端解释的字符串,我们可以通过将这些字符串插入到要打印的字符串的适当位置来实现所需的效果,方法是替换

/HTML|php|CSS|Java(Script)?/ and print RED, $_

s/HTML|php|CSS|Java(?:Script)?/RED.$&.RESET/eg; print

我们可以这样写shell命令:

perl -MTerm::ANSIColor=RED,RESET -pe's/HTML|php|CSS|Java(?:Script)?/RED.$&.RESET/eg'

我们可以如下移除依赖:

perl -pe'
   BEGIN { $RED="\e[31m"; $RESET="\e[0m" }
   s/HTML|php|CSS|Java(?:Script)?/$RED$&RESET/g
'

(可以保留或删除换行符。)

我们甚至可以以可读性、可维护性等为代价来内联字符串。

perl -pe's/HTML|php|CSS|Java(?:Script)?/\e[31m$&\e[0m/g'

推荐阅读