首页 > 解决方案 > 如何突出显示多个匹配项?

问题描述

我有一个 shell 函数(我在 Zsh 中使用,但它应该在 Bash 中工作)突出显示输出中的匹配文本,因此我可以快速找到内容。

function highlight() {
  perl -pe "s/$1/\e[1;31;43m$&\e[0m/g"
}

这非常方便,但它只适用于单个参数。如果我有固定数量的参数,我可以执行以下操作:

perl -pe "s/abc/def/; s/fgh/hij/;"

但这当然很疯狂。如何使用未指定数量的参数来完成这项工作?

我的特定用例(以防它有所不同)是通过管道传输 Git 分支列表,并突出显示$(git branch --no-merged master)列表中的输出,因此我可以在更大的所有分支列表的上下文中看到所有未合并的分支突出显示.

标签: bashgitperlzsh

解决方案


您可以通过利用 bash 中的特殊参数和简化 perl 正则表达式来轻松完成此操作。我可以进一步解释它们:

Bash/Zsh 特殊参数

有关更多信息,请参见手册页。(https://tiswww.case.edu/php/chet/bash/bashref.html#Special-Parameters

在 bash 中,您可以使用特殊参数访问传递给函数的所有$*参数,这使您可以轻松处理可变数量的参数。在您的情况下,您想要搜索并突出显示每个传递的值。的好处$*是它将通过为IFS变量设置的任何值来分隔参数。

多匹配正则表达式

OR您可以简单地在表达式中使用条件来搜索文档中的多个单词,而不是通过添加额外的规则来复制匹配逻辑。这是通过|在您要搜索的单词之间添加一个竖线 ( ) 来完成的。

综上所述,我们可以使用这样的函数来支持在文档中搜索多个单词。

function highlight() {
  IFS='|'
  perl -pe "s/$*/\e[1;31;43m$&\e[0m/g"
}

这是一个相当简单的示例,如果您的目标字符串包含如下空格,它甚至可以正常工作:

highlight "my string"


推荐阅读