如何使用grep命令匹配同时包含多个指定字符的单词?
如何用grep提取同时包含多个指定字符的单词
要提取同时包含"b"和"p"(顺序不限)的单词,你可以用以下两种可行方法:
方法1:Perl兼容正则(支持正向预查)
如果你的grep支持-P选项(大部分GNU grep都支持),可以用正向预查同时校验两个字符的存在:
grep -P "\b(?=.*b)(?=.*p)\S+\b" input
\b:匹配单词边界,确保我们处理的是完整单词(?=.*b):正向预查,确保单词内存在字符"b"(?=.*p):再做一次正向预查,确保单词内同时存在字符"p"\S+:匹配非空白字符(适配你例子里带逗号的单词,若只需纯字母可换成\w+)
方法2:多轮grep管道过滤
如果你的grep不支持-P(比如BSD系统的默认grep),可以用管道串联多次grep,逐步筛选:
grep "b" input | grep "p"
- 第一个
grep "b"先筛选出所有包含"b"的行 - 第二个
grep "p"再从结果里筛选出同时包含"p"的行,最终得到同时满足两个条件的单词
你之前尝试的问题说明
grep -E "\b[bp]\b" input:仅匹配单个b或p作为完整单词的情况,完全不符合需求grep -E "\b(b|p)\b" input:只要单词包含b或p其中一个就会匹配,无法同时校验两个字符都存在grep -E "\bb.*p\b" input:只能匹配b在p之前的单词,无法覆盖p在b前面的情况(比如你例子里的printable,)
内容的提问来源于stack exchange,提问作者Rando Mest
相关产品推荐
相关产品推荐

