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

如何在Bash脚本中通过curl调用后grep匹配多个指定字符串?

解决Bash脚本中匹配多个变量并仅输出存在值的问题

问题分析

你当前的写法存在两个核心问题:

  1. 用单引号包裹模式'$var1|$var2'时,Bash不会解析变量,grep会直接匹配字面量$var1和$var2,完全无法命中目标内容。
  2. 用双引号的"$var1\|$var2"虽能解析变量,但grep默认用基础正则,|需转义,且这种写法会输出整个匹配行,而非仅输出存在的变量值。

以下是几种精准符合需求的解决方案:

方案1:扩展正则匹配+仅输出匹配值

把所有变量拼接成扩展正则模式,借助grep的扩展正则和仅输出匹配片段的选项,结合去重操作直接输出存在的变量值:

var1="text1"
var2="text2"
var3="text3"
var4="text4"
var5="text5"
var6="text6"

# 拼接所有变量为扩展正则模式(用|分隔)
match_pattern="$var1|$var2|$var3|$var4|$var5|$var6"

# 获取远程内容并匹配,仅输出存在的变量值,去重避免重复输出
curl -s "https://web.net/list.txt" | grep -Eo "$match_pattern" | sort -u

方案2:预取内容+逐个检查变量

先一次性拉取远程内容,再逐个检查变量是否存在,存在则输出变量值(避免多次请求远程站点):

var1="text1"
var2="text2"
var3="text3"
var4="text4"
var5="text5"
var6="text6"

# 一次性获取远程内容到变量
remote_content=$(curl -s "https://web.net/list.txt")

# 遍历所有变量,检查是否存在于内容中,存在则输出
for target_var in "$var1" "$var2" "$var3" "$var4" "$var5" "$var6"; do
    if echo "$remote_content" | grep -q "$target_var"; then
        echo "$target_var"
    fi
done

方案3:固定字符串匹配(规避正则特殊字符干扰)

如果你的变量包含正则特殊字符(如.、*等),用固定字符串匹配更安全,不会出现误匹配:

var1="text1"
var2="text2"
var3="text3"
var4="text4"
var5="text5"
var6="text6"

# 将变量按行输出作为匹配模式,用grep固定字符串匹配
printf "%s\n" "$var1" "$var2" "$var3" "$var4" "$var5" "$var6" | grep -Fxf - <(curl -s "https://web.net/list.txt")
  • -F:启用固定字符串匹配,不将变量视为正则表达式
  • -f -:从标准输入读取匹配模式(即我们输出的变量列表)
  • -x:仅匹配整行内容(不需要整行匹配的话可去掉该选项)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:45:05