Как найти файлы, содержащие две строки в разных строках

Реальный пример: у меня есть файл Python util.py , и я сменил одно из имени функции с foo на bar . Могут быть другие файлы, использующие foo как имя функции, и они неактуальны.

Я хочу обновить все файлы Python в проекте от foo до bar . Поэтому я хотел бы выполнить поиск файлов для импорта, таких как:

 import project.path.util 

или

 from project.path.util import foo 

и любые вызовы foo например, начиная с:

 foo( 

Решение должно быть устойчивым к пробелам. Я могу искать каждый из них с помощью grep но я не уверен в комбинированном поиске. Любые предложения будут оценены.

3 Solutions collect form web for “Как найти файлы, содержащие две строки в разных строках”

С инструментами 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' 

Это работает, прося grep to

  1. искать рекурсивно ( -r )
  2. вывод имен совпадающих файлов ( -l )
  3. разделенных NUL вместо LF ( -Z )
  4. считая только файлы, заканчивающиеся на '.py' ( --include='*.py' )

и попросить sed выполнить замену на месте ( -i ) во всех совпадающих файлах, если они есть ( xargs -r ).

Это должно быть сделано.

/g заменит все экземпляры foo на bar

 find <Project root dir> -type f -exec sed -i "{}" -e 's/foo/bar/g' \; 

Если вы хотите ограничить изменение только файлами * .py:

 find <Project root dir> -type f -name "*.py" -exec sed -i "{}" -e 's/foo/bar/g' \; 

Если есть случаи foo, которые не должны быть заменены, вы можете ограничить до 4 случаев:

  • импортировать foo
  • из модуля import foo
  • def foo
  • foo (

Но нет

  • damned_foo (
  • damnedfoo (
  • damned1foo (
  • проклятый-Foo (

Тогда команда будет выглядеть так:

 foo="foo";bar="bar";find <Project root dir> -type f -exec sed -i "{}" \ -r -e "s/[^a-zA-Z0-9_\-]$foo\(/$bar\(/g" -e "s/def $foo/def $bar/g" \ -e "s/import $foo/import $bar/g" \; 

Предположим, что вы находитесь в каталоге, который хотите выполнить поиск (он также соответствует любому подкаталогу):

  for i in `find . -type f -name '*.py' -exec grep -lr 'foo' {} +`; do sed -i 's/foo/bar/' $i; done 

Редактировать:

Чтобы избежать совпадения функций, содержащих символы, например «damned_fools», мы можем улучшить его с помощью \ b для соответствия границам слов:

 for i in `find . -type f -name '*.py' -exec grep -lr 'foo' {} +`; do sed -i 's/\bfoo\b/bar/' $i; done 

Ссылка: https://stackoverflow.com/questions/1032023/sed-whole-word-search-and-replace

  • Изменен синтаксис grep -E regex?
  • Согласование многострочного шаблона с помощью sed, awk или grep
  • Шаблон соответствия \\\ ", используя grep
  • Как выбрать и вывести текст в строке
  • Как найти файлы, содержащие один критерий, но исключая другой критерий
  • grep линии, начинающиеся с «1» в Ubuntu
  • Печать текста между многострочными разделителями
  • Поиск файлов, содержащих несколько ключевых слов в любом месте файла
  • Помощь с регулярным выражением в grep
  • Разноцветный Греп
  • ls и команда find, исключая определенный каталог
  • Interesting Posts

    Могу ли я запустить процесс как root без запуска оболочки входа root?

    Не понимаю, почему getfattr -d ничего не показывает

    lsof: показать файлы, открытые как чтение-запись

    Как использовать порты USB на мониторе для звука

    Тоннель SSH в фоновом режиме

    «меньше» вопросов ширины

    Подскажите пароль sudo и программно повысите привилегию в скрипте bash?

    Измените предпочтительный сетевой адаптер в маршрутах по умолчанию

    Является ли Просветление полноценным DE или просто WM?

    Есть ли проверенные веб-браузеры в OpenBSD?

    Почему словосочетание и расширение имени файла не применяются к условному выражению внутри `]`?

    Противоположное поведение keepalive (обратный прокси nginx на ElasticSearch)

    Установите Debian поверх Ubuntu, используя тот же домашний раздел

    Можно отправить сообщение с (plain) mailx?

    Как напечатать максимальное значение, если оно выше, сравните с медианным значением других, используя большой набор данных

    Linux и Unix - лучшая ОС в мире.