我有几个大文本文件,在文件中UNIQS.txt我有一个grep来自另一个文件的字符串列表。我使用的代码是
grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam
Run Code Online (Sandbox Code Playgroud)
什么都不做 - 生成的文件是空的。但是当我这样做时
grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam
Run Code Online (Sandbox Code Playgroud)
它工作正常。这让我感到困惑,因为我认为grep不会将条目解释UNIQS.txt为没有引号和斜杠等的正则表达式模式在文件中(没有)。一般来说,如果您从文件中获取模式,那么它会自动认为它们是正则表达式模式吗?
编辑:在UNIQS.txt文件中,有表单的换行符分隔字符串
HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783
Run Code Online (Sandbox Code Playgroud)
(称为模板名称)和文件EEP_VSL...制表符分隔的列,大约有14列,第一列是模板名称,所以基本上我想提取文件中每个模板对应的行。
Gil*_*il' 87
该-f选项指定 grep 读取模式的文件。这就像在命令行上传递模式一样(-e如果有多个,则使用该选项),除了当您从 shell 调用时,您可能需要引用该模式以保护其中的特殊字符不被 shell 扩展。
参数-Eor-F或-P,如果有的话,告诉 grep 模式是用哪种语法编写的。没有参数,grep 需要基本的正则表达式;with -E, grep 需要扩展的正则表达式;使用-P(如果支持),grep 需要Perl 正则表达式;和-F,grep 需要文字字符串。模式是来自命令行还是来自文件并不重要。
请注意,字符串是子字符串:如果您a+b作为模式传递,a+b+c则匹配包含的行。如果要搜索仅包含所提供字符串之一的行,请传递该-x选项。