如何使用os.system()grep两个字符串

时间:2014-08-09 19:09:36

标签: python grep

我们如何使用os.system() grep两个字符串?

以下命令失败:

os.system("grep " + "Section\|Function"   + Text_file +  "> results.csv")

3 个答案:

答案 0 :(得分:0)

这是可行的选项之一。 @mata为您提供了更多可能性的清单。

os.system("grep -E 'Section|Function' " + Text_file + "> results.csv")

因此,确保在"功能"。之后需要一个额外的空间 此外,要搜索多个字符串,一个选项是-E标志,它允许在搜索条件中扩展正则表达式。

答案 1 :(得分:0)

我认为如果使用python的字符串格式而不是+,则更容易理解字符串:

os.system("grep -E 'Section|Function' {} > results.csv".format(Text_file))

-E启用扩展正则表达式。这样就无需grep查看转义的垂直条。

运行此命令时,它会经过三个阶段:python,bash和grep。命令字符串必须考虑到所有三个阶段。请注意,python字符串用双引号括起来。在python中,双引号和单引号之间的含义没有区别。在bash,有一个重要的区别。因为python字符串用双引号括起来,所以我们可以在其中包含正则表达式的单引号。当bash看到单引号时,它会单独留下正则表达式。这样,我们在python中看到的正则表达式将与传递给grep的正则表达式相同。

答案 2 :(得分:0)

模式中的反斜杠只是阻止shell解释管道符号,grep在这种情况下会看到Section|Function。默认模式下的grep不会将管道解释为OR,而是作为文字管道,仅在扩展模式下(使用-E标志)将其解释为OR,默认模式你需要用另一个反斜杠来逃避它。

当你在一个字符串中有转义字符(backsalsh)时,你应该使用原始字符串,并且在第二个模式之后你也错过了一个空格。

所以你有几个选择,这些都应该产生相同的结果:

os.system(r"grep Section\\\|Function "   + Text_file +  "> results.csv")
os.system(r"grep 'Section\|Function' "   + Text_file +  "> results.csv")
os.system(r"grep -E Section\|Function "   + Text_file +  "> results.csv")
os.system(r"grep -E 'Section|Function' "   + Text_file +  "> results.csv")
os.system(r"grep  -e Section -e Function "   + Text_file +  "> results.csv")