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

Bash脚本多关键词文本高亮实现及管道异常问题排查

两个Bash高亮脚本问题的解决方案

问题1:数组多关键词批量高亮匹配

你的初始脚本直接用$ARRAY时,Bash会把数组展开成空格分隔的字符串(比如wait bad),sed只会把它当作一个整体匹配,没法分别高亮每个关键词。要实现数组内所有关键词的高亮,需要把数组转换成sed支持的多分支正则表达式(用|分隔每个关键词),再逐个替换。

修复后的代码

#!/bin/bash

ARRAY=(wait bad)
# 把数组转成sed可用的正则:wait\|bad
PATTERN=$(IFS="|"; echo "${ARRAY[*]}")

while read -r line; do
    echo "$line" | sed -E "s/($PATTERN)/$(printf "\033[32m\1\033[0m")/g"
done < peptides.txt

说明

  • IFS="|"; echo "${ARRAY[*]}":用|作为分隔符,把数组元素拼接成wait|bad,适配sed的多匹配格式。
  • sed -E "s/($PATTERN)/.../g":用括号捕获匹配的关键词,替换时用\1引用原关键词,保证高亮的是单个匹配项而非整个数组字符串。
  • -r选项给read,避免处理特殊字符时出现异常。

运行后,peptides.txt里的bad和wait都会被绿色高亮,其他行正常输出。


问题2:管道中grep无匹配时退出的问题

原因

你脚本开头设置了set -euo pipefail,这个组合选项的作用是:

  • set -e:管道中任意命令返回非0(比如grep没找到匹配时返回1),整个脚本立即退出。
  • set -o pipefail:管道的退出状态取最后一个非0命令的状态,而非最后一个命令的状态。

你添加无效关键词的本质是让每个grep总能找到匹配、返回0,避免触发set -e导致脚本退出,但这是临时 workaround,没必要依赖无效关键词。

解决方案:让grep无匹配时仍传递原内容并返回0

不需要修改.db文件,只需要把每个grep命令包裹在子shell里,当grep没匹配时,用cat把输入原封不动传递下去,同时让整个子shell返回0。修改后的管道部分如下:

cat frog.txt \
| { egrep-green -z -w -f continuation.db || cat; } \
| { egrep-red-highlight -z -w -f evidence.db || cat; } \
| { egrep-red -z -w -f conclusion.db || cat; } \
| { egrep-red-blinking -z -w -f refutation.db || cat; } \
| { egrep-yellow-highlight -z -w -f comparison.db || cat; } \
| { egrep-yellow-underline -z -w -f contrast.db || cat; } \
| { egrep-yellow-underline -z -w -f opposition.db || cat; } \
| { egrep-yellow -z -w -f sequence.db || cat; } \
| { egrep-yellow-italic -z -w -f positive.db || cat; } \
| { egrep-blue-italic -z -w -f negative.db || cat; } \
| { egrep-cyan-italic -z -w -f extreme.db || cat; } \
| { egrep-magenta-italic -z -w -f moderating.db || cat; } \
| fold -w 240 -s

说明

  • { command || cat; }:如果grep找到匹配,正常输出高亮后的内容;如果没找到,cat会把前一个管道的输入原封不动输出,同时||让整个子shell返回0,不会触发set -e。
  • 保留set -euo pipefail的前提下,既保证脚本的严谨性,又解决了无匹配时管道退出的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:53:11