You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现支持多关键词匹配的Shell文本高亮函数?

改造Shell高亮函数支持多参数,适配Git未合并分支场景

嘿,这个需求太实用了!我经常用类似的高亮工具快速定位日志或Git分支里的关键内容,刚好可以帮你把原来的单参数highlight函数改成支持任意多参数的版本,完美适配你要高亮未合并Git分支的场景~

先看改造后的完整函数

function highlight() {
    local patterns=()
    for pattern in "$@"; do
        # 转义正则元字符(分支名里的.、*这类字符不会干扰匹配)
        local escaped_pattern=$(printf '%s\n' "$pattern" | sed 's/[.[\*^$+?()|]/\\&/g')
        patterns+=("s/$escaped_pattern/\e[1;31;43m$&\e[0m/g")
    done
    # 把所有替换规则用分号拼接后传给Perl
    perl -pe "$(IFS=';'; echo "${patterns[*]}")"
}

函数逻辑解释

  1. 收集所有参数:用$@获取传入的所有关键词,遍历每个关键词生成对应的Perl替换规则;
  2. 正则转义:因为Git分支名可能包含.、*这类正则元字符,所以用sed提前转义,避免匹配出错;
  3. 拼接替换规则:把所有生成的s/.../.../g规则用分号连接,一次性传给Perl的-pe参数,实现多关键词同时高亮。

适配你的Git场景的用法

现在你可以直接把未合并分支作为参数传给highlight,比如用一行命令实现:

# 获取未合并到master的分支名,高亮显示在全部分支列表中
git branch | highlight $(git branch --no-merged master | awk '{print $NF}')

或者分步写更清晰:

# 提取未合并分支名(去掉分支前的*和空格)
unmerged_branches=$(git branch --no-merged master | sed 's/^\* //; s/^  //')
# 高亮全部分支列表中的未合并分支
git branch | highlight $unmerged_branches

额外小技巧

这个改造后的函数不止能用在Git场景,还能用来高亮日志里的多个关键词,比如:

# 同时高亮日志里的ERROR和WARNING关键词
tail -f app.log | highlight ERROR WARNING

内容的提问来源于stack exchange,提问作者iconoclast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:21:00