Bash 具有存储在文件中的通配符的grep

Bash 具有存储在文件中的通配符的grep,bash,macos,unix,Bash,Macos,Unix,我希望grep通过读取需要从文本文件中过滤出来的内容来过滤掉行 这是我给格雷普的。它存储在foo.txt中: ".* /Users/1337/X$" ".* /Users/1337/R$" ".* /Users/1337/W$" 1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2 /Users/1337/R dc460da4ad72c482231e28e688e01f2778a88ce31a08826899d

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

这是我给格雷普的。它存储在
foo.txt
中:

".*  /Users/1337/X$"
".*  /Users/1337/R$"
".*  /Users/1337/W$"
1121cfccd5913f0a63fec40a6ffd44ea64f9dc135c66634ba001d10bcf4302a2  /Users/1337/R
dc460da4ad72c482231e28e688e01f2778a88ce31a08826899d54ef7183998b5  /Users/1337/T
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865  /Users/1337/W
53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3  /Users/1337/X
这里是它应该过滤的内容。它存储在
bar.txt
中:

".*  /Users/1337/X$"
".*  /Users/1337/R$"
".*  /Users/1337/W$"
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)-发布版

请尝试以下
awk
,如果这对您有帮助,请告诉我

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

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

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

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

grep-f您需要删除模式中的引号(正则表达式,而不是通配符语句),因此
。想用
-e
发布答案,但您的答案大大简化了它。是的,
grep
-f
选项的全部原因是这样您就不必做类似的事情(在将数组添加到外壳之前,这是不可能的)。当然,现在删除了答案。效果非常好。谢谢。