【问题标题】:return the grep result to a variable, do it in python? [duplicate]将 grep 结果返回给变量,在 python 中执行吗? [复制]
【发布时间】:2021-01-04 06:09:01
【问题描述】:

我想 grep 模式并将其返回给一个变量,对于多个文件,我知道如何使用 bash 来完成,但现在我想在 python 中实现它。

在 bash 中,我可以做这样的事情

for i in {1..3}
do
  result=$(grep "pattern" folder/name-${i}/out)
done

但是,我不确定如何在 Python 中执行此操作。 我试过了:

for i in range(1,4):
    name = 'name-' + str(i)
    result = subprocess.check_output("grep 'pattern' folder/{name}/out", shell=True)

返回错误grep: folder/{name}/out: No such file or directory

有人知道怎么解决吗?

【问题讨论】:

  • 错误自行解释,folder/{name}/out 不是有效路径
  • 您在字符串之前错过了f,使其成为 f 字符串。
  • 字符串中的变量未解析为变量。您需要格式化字符串。另外,如果您想在 Python 中“更多”地解决它:regex101.com 网站上有一个 Python 代码生成器。因为你还在 sh 中做正则表达式的工作。
  • 从 Python 运行 grep 几乎总是很容易通过在 Python 本身中进行正则表达式搜索来避免。避免外部流程通常会带来性能上的提升,而且您通常可以通过本地处理来优化整体流程。简单来说; import re; with open(f'folder/{name}/out') as thing: result = [line for line in thing if re.match('pattern', line)]

标签: python bash grep subprocess


【解决方案1】:
for i in range(1,4):
    name='name-'+str(i)
    result=subprocess.check_output("grep 'pattern' folder/%s/out" % name, shell=True)

或者在你的命令前加上 f:

result = subprocess.check_output(f"grep 'pattern' folder/{name}/out", shell=True)

【讨论】:

    【解决方案2】:

    您需要在字符串前加上f 才能使其成为f-string

    for i in range(1, 4):
        name = 'name-' + str(i)
        result = subprocess.check_output(f"grep 'pattern' folder/{name}/out", shell=True)
    

    或者你可以做%字符串格式化:

    for i in range(1, 4):
        name = 'name-' + str(i)
        result = subprocess.check_output(f"grep 'pattern' folder/%s/out" % name, shell=True)
    

    【讨论】:

      【解决方案3】:

      您忘记在"grep 'pattern' folder/{name}/out" 之前添加f。所以你可以使用:

      for i in range(1, 4):
          name = 'name-' + str(i)
          result = subprocess.check_output(f"grep 'pattern' folder/{name}/out", shell=True)
      

      或者你可以使用str.format():

      for i in range(1, 4):
          name = 'name-' + str(i)
          result = subprocess.check_output("grep 'pattern' folder/{name}/out".format(name=name), shell=True)
      

      【讨论】:

        猜你喜欢
        • 2017-08-31
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 2016-01-03
        • 2012-01-29
        • 2017-04-16
        • 2017-03-06
        • 2021-08-11
        相关资源
        最近更新 更多