如何从文件动态生成以|分隔、可用于grep -f的匹配模式列表
方法1:用paste命令实现(最简便)
paste命令本身就支持按指定分隔符拼接多行内容,直接搭配命令替换就能一步生成你需要的grep命令:
假设你的数字存储在num.txt文件中,直接执行以下命令即可:
grep -P "($(paste -sd '|' num.txt))\|" o.txt
参数说明:
paste -sd '|' num.txt:-s表示串行处理所有行,-d '|'指定分隔符为|,执行后直接输出11|12|31|40|42|90的拼接结果$()是shell命令替换,会把内部命令的输出插到对应位置,刚好填充到正则的括号中
方法2:用xargs实现
如果要按你原本的思路用xargs实现,可以先用tr工具把换行符替换为|,再通过xargs的占位符参数插到命令对应位置:
tr '\n' '|' < num.txt | xargs -I {} grep -P "({})\|" o.txt
参数说明:
tr '\n' '|'把输入的换行符全部替换为|,得到拼接后的数字串xargs -I {}表示把前面传入的内容作为变量,替换后续命令中所有{}的位置,实现把拼接串插到正则中间的效果
额外补充:直接用grep -f的方案
如果你需要生成供grep -f使用的模式列表,其实不需要拼接|,grep -f默认每行作为一个独立匹配模式,要匹配数字后跟|的场景可以直接这么写:
# 直接生成模式文件后匹配 sed 's/$/|/' num.txt > pattern.txt grep -F -f pattern.txt o.txt
-F参数表示按固定字符串匹配,不需要正则解析,运行效率更高。
内容的提问来源于stack exchange,提问作者Eric Stotch
相关产品推荐
相关产品推荐

