如何实现支持多关键词匹配的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[*]}")" }
函数逻辑解释
- 收集所有参数:用
$@获取传入的所有关键词,遍历每个关键词生成对应的Perl替换规则; - 正则转义:因为Git分支名可能包含
.、*这类正则元字符,所以用sed提前转义,避免匹配出错; - 拼接替换规则:把所有生成的
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
相关产品推荐
相关产品推荐

