如何在不同行中查找包含两个字符串的文件

Xia*_* Su 6 grep find

一个真实的例子是:我有一个Python文件util.py,我改变了函数名从一个foobar。可能还有其他文件foo用作函数名,它们无关紧要。

我想从更新项目中的所有的Python文件foobar。所以我想对导入的文件进行搜索,例如:

import project.path.util
Run Code Online (Sandbox Code Playgroud)

或者

from project.path.util import foo
Run Code Online (Sandbox Code Playgroud)

以及对foo诸如以下内容的任何调用:

foo(
Run Code Online (Sandbox Code Playgroud)

解决方案必须是空白容忍的。我可以使用它们中的每一个进行搜索,grep但我不确定组合搜索。任何建议将不胜感激。

Sté*_*las 5

使用 GNU 工具:

grep -rlZ --include='*.py' -e 'import project.path.util' \
                           -e 'from project.path.util import.*\bfoo\b' . |
  xargs -r0 sed -i 's/\bfoo\b/bar/g'
Run Code Online (Sandbox Code Playgroud)

该作品通过询问grep

  1. 递归搜索 ( -r)
  2. 输出匹配文件的名称 ( -l)
  3. 由 NUL 而不是 LF ( -Z)分隔
  4. 仅考虑以 '.py' ( --include='*.py')结尾的文件

并要求在所有匹配文件中sed执行就地替换 ( -i),如果有 ( xargs -r)。