我们如何使用os.system()
grep两个字符串?
以下命令失败:
os.system("grep " + "Section\|Function" + Text_file + "> results.csv")
答案 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")