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

/proc файловая система не реальна, это - представление во внутренние ядром данные, экспортируемые для сходства с файлами. Это существует в Linux и в Солярисе (от того, где идея бесстыдно воровалась), и возможно другие системы Unixy. Формат очень системно-зависим (и даже изменился существенно среди версий ядра Linux).

Действительно нет никакого промежуточного портативного способа узнать аппаратные данные (и не может быть, некоторые Нельды и двойники работают на довольно странном железе).

6
19.04.2014, 04:11
3 ответа

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

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

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

5
27.01.2020, 20:29

Так и должно быть.

/ 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, который не следует заменять, можно ограничить четырьмя случаями:

  • import foo
  • from module import foo
  • def foo
  • foo (

Но не

  • damned_foo (
  • damnedfoo (
  • damned1foo (
  • damned-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" \;
0
27.01.2020, 20:29

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

 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

0
27.01.2020, 20:29

Теги

Похожие вопросы