如何通过命令行查找包含指定单词集合中任意单词为前缀的所有行
命令行匹配前缀行方案
首选grep方案
直接使用grep结合sed预处理前缀匹配规则即可实现需求:
# 基础版本(A中无正则元字符时使用) grep -f <(sed 's/^/^/' A) B # 通用兼容版本(A中包含正则特殊字符也可正常匹配) grep -F -f <(sed '/^$/d; s/^/^/' A) B
命令逻辑说明
sed '/^$/d; s/^/^/' A先过滤A中的空行,再给A里的每个单词前加正则行首定位符^,确保只有行首匹配的内容才会被命中-f参数让grep从预处理后的规则列表中读取匹配模式-F参数将所有模式视为普通固定字符串,避免. * + []这类正则元字符被意外解析
示例验证
针对给出的示例,预处理后的匹配规则为^apple、^bob、^cheese,匹配B文件时:
aple不匹配任何规则bob123匹配^bob规则,被输出ches不匹配任何规则
最终输出结果和预期完全一致。
备选awk方案(兼容性更高)
如果你的环境不支持进程替换<()语法,可以使用awk实现,不需要依赖其他命令:
awk 'NR==FNR {if($0!="") prefix[$0]=1; next} {for(p in prefix) if(index($0,p)==1) {print; break}}' A B
命令逻辑说明
- 先读取A文件,将非空的前缀存入数组
- 再逐行读取B文件,检查当前行是否以数组中任意一个前缀开头(
index($0,p)==1表示前缀p在当前行的第一个位置出现),命中则直接输出该行并跳出循环,避免同一行重复匹配多个前缀时重复输出。
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

