如何让grep读取文件中的通配符规则过滤指定文本行?
使用grep通过外部规则文件过滤文本行
这事儿其实很简单,grep本身就支持从文件读取匹配规则,刚好满足你的需求。下面分两种情况给你方案:
情况1:先整理规则文件格式(推荐)
你的foo.txt里现在带了双引号,而且所有规则挤在一起,这会让grep识别出错。先把foo.txt改成每行一个正则规则的格式,去掉多余引号:
.* /Users/1337/X$ .* /Users/1337/R$ .* /Users/1337/W$
然后直接运行下面的命令就能过滤bar.txt:
grep -f foo.txt bar.txt
这个命令里的-f参数就是告诉grep:“去这个文件里读我的匹配规则,每行算一个”。
情况2:不想修改规则文件
如果不想动foo.txt的内容,我们可以用bash的进程替换先把引号去掉,再传给grep:
grep -f <(sed 's/"//g' foo.txt) bar.txt
这里的<(sed 's/"//g' foo.txt)会先把foo.txt里的所有双引号删掉,再把处理后的内容作为临时规则文件给grep用。
效果验证
拿你给出的bar.txt示例内容来说:
1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2 /Users/1337/R
dc460da4ad72c482231e28e688e01f2778a88ce31a08826899d54ef7183998b5 /Users/1337/T
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 /Users/1337/W
运行命令后,会输出匹配到的两行:
1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2 /Users/1337/R 4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 /Users/1337/W
要是你担心行尾可能有多余空格,可以把正则改成.* /Users/1337/X\s*$,这样就能匹配行尾带空白的情况啦。
内容的提问来源于stack exchange,提问作者leetbacoon
相关产品推荐
相关产品推荐

