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

如何使用单个grep命令匹配字符串中间同时存在的两个指定关键词

问题原因

你之前的写法匹配不到结果的核心原因是混淆了shell通配符和grep正则表达式的语法:*在正则中是量词,代表前一个字符匹配0次及以上,不能单独作为任意内容匹配使用,正则中匹配任意长度的任意字符需要用.*(.匹配单个任意字符,*限定它可以出现任意次)。你转义*的写法反而会去匹配字符串中不存在的字面量*字符,自然得不到预期结果。

解决方案

场景1:两个关键词顺序固定(和你原多grep串联逻辑一致,比如going必须出现在school前面)

直接用.*连接两个关键词即可,同时grep自带-c参数可以直接输出匹配行数,不需要额外调用wc -l:

# 匹配string1中同时包含going(在前)和school(在后)的行数
isTrue=$(echo "$string1" | grep -c 'going.*school')

# 匹配string1中同时包含playing(在前)和match(在后)的行数
isTrue=$(echo "$string1" | grep -c 'playing.*match')

注意:变量用双引号包裹可以避免字符串空格导致的拆分异常,$()是比反引号更推荐的命令替换写法,兼容性更好。

场景2:两个关键词顺序不固定,只要同时存在就算匹配

方法1:启用Perl正则(-P参数,适用于GNU grep,绝大多数Linux发行版默认支持),用正向预查实现:

isTrue=$(echo "$string1" | grep -P -c '(?=.*going)(?=.*school)')

方法2:通用兼容写法(支持BSD grep,比如macOS环境),用扩展正则枚举两种顺序:

isTrue=$(echo "$string1" | grep -E -c 'going.*school|school.*going')

场景3:同时匹配多组关键词(比如查「going+school」或者「playing+match」任意一组命中就算匹配)

用-e参数指定多个匹配规则即可:

isTrue=$(echo "$string1" | grep -c -e 'going.*school' -e 'playing.*match')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:42:00