grep与存储在文件中的通配符

时间:2018-03-28 15:21:03

标签: bash macos unix

我希望grep通过读取从文本文件中过滤出来的内容来过滤掉行。

这是我给grep的。它存储在foo.txt

".*  /Users/1337/X$"
".*  /Users/1337/R$"
".*  /Users/1337/W$"

以下是它应该过滤的内容。它存储在bar.txt

1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2  /Users/1337/R
dc460da4ad72c482231e28e688e01f2778a88ce31a08826899d54ef7183998b5  /Users/1337/T
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865  /Users/1337/W
53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3  /Users/1337/X

这是我运行的命令:

cat bar.txt | grep -f foo.txt

我希望它输出:

1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2  /Users/1337/R
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865  /Users/1337/W
53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3  /Users/1337/X

但它没有输出任何东西。我该如何解决这个问题?

Mac OS X Yosemite,bash 3.2.57(1)-release

2 个答案:

答案 0 :(得分:4)

您应该从foo.txt删除双引号。引用由shell处理以保护特殊字符,但它们实际上并不是模式的一部分,并且在从文件读取时按字面意思处理。

如果您无法修改该文件,可以使用进程替换动态删除它们:

grep -f <(sed 's/^"\(.*\)"$/\1/' foo.txt) bar.txt

答案 1 :(得分:0)

您能否请关注awk并告诉我这是否对您有所帮助。

awk 'FNR==NR{sub(/\$.*/,"",$NF);a[$NF];next} ($NF in a)' foo.txt  bar.txt