perl - 突出显示与正则表达式匹配的文本
问题描述
当我使用ag
或rg
选择文本时,它会突出显示选定的文本。
$ 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 匹配的文本?
解决方案
您将颜色切换为红色,打印整行,然后保持红色。不好。
您想打印不匹配的文本,将颜色切换为红色,打印匹配的文本,重置颜色,然后根据需要重复。
由于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'
推荐阅读
- swift - 图像未在 Alamofire 中使用 multipartformdata 上传到服务器
- kotlin - 作业问题 - 我做错了什么?
- java - 异常是 java.net.ProtocolException:无效的 HTTP 方法:PATCH
- html - 在没有浮动的情况下将元素彼此相邻定位不能正确排列在顶部
- php - 是否可以从网站自动更新“Google 我的商家”信息?
- java - 当数据库不可用但所有数据都被缓存时,防止 Hibernate / Spring 失败
- amazon-sagemaker - 如何在 AWS Sagemaker Studio 上挂载 EFS 卷
- java - JSONObject 到 ArrayList 方括号丢失
- .htaccess - 如何重定向其中包含 %something% 的 URL
- java - ns 不存在,com.mongodb.MongoCommandException