从文件中读取 grep 模式

从文件中读取 grep 模式

我有几个大文本文件,在文件中我有一个来自另一个文件的UNIQS.txt字符串列表。grep我使用的代码是

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

它什么也不做 - 生成的文件是空的。但当我这样做时

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

它工作正常。这让我感到困惑,因为我认为grep不会将文件中的条目解释UNIQS.txt为不带引号和斜杠的正则表达式模式(文件中没有)。一般来说,如果您从文件中获取模式,那么它会自动认为它们是正则表达式模式吗?

编辑:UNIQS.txt文件中,有以下形式的换行符分隔的字符串

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(称为模板名称)和文件EEP_VSL...选项卡分隔列,大约有 14 列,第一列是模板名称,所以基本上我想提取文件中每个模板对应的行。

答案1

-f选项指定 grep 读取模式的文件。这就像在命令行上传递模式(-e如果有多个模式,则使用选项),只不过当您从 shell 调用时,您可能需要引用模式以保护其中的特殊字符不被 shell 扩展。

参数-Eor-F-P,如果有的话,告诉 grep 模式是用哪种语法编写的。如果没有参数,grep 期望基本正则表达式;与-E, grep 期望扩展正则表达式; with -P(如果支持的话),grep 期望Perl正则表达式;对于-F,grep 需要文字字符串。模式是来自命令行还是来自文件并不重要。

请注意,字符串是子字符串:如果您a+b作为模式传递,则a+b+c匹配包含的行。如果您想搜索仅包含所提供字符串之一且不再包含更多字符串的行,请传递该-x选项。

答案2

我遇到了同样的错误,但没有用 @gilles 的好答案解决。仔细查看输入文件,我发现末尾有 2 个换行符。没有这些,成功,只需要: grep -i file_pattern_input file

(GNU grep 3.1,输入文件超过5000条记录,匹配​​/模式文件2536,我知道所有2536都必须在文件中。使用换行符可以获得文件的所有行,而只有2536个匹配行)

相关内容