実際の例:Pythonファイルがあり、関数名util.py
の1つを 。関数名として使用される他のファイルがある可能性がありますが、これは関係ありません。foo
bar
foo
私のプロジェクトのすべてのPythonファイルをからに更新したいと思います。したがって、foo
次bar
のようなインポートされたファイルを検索したいと思います。
import project.path.util
または
from project.path.util import foo
次に始まるすべてのfoo
通貨:
foo(
ソリューションは空白を許可できる必要があります。それぞれを使用して検索できますが、grep
検索を組み合わせることについてはわかりません。どんなアドバイスも本当にありがとうございます。
答え1
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
必要です。
- 再帰検索(
-r
) - 一致するファイルの名前を出力します(
-l
)。 -Z
LF( ) の代わりに NUL で区切る- '.py'(
--include='*.py'
) で終わるファイルのみを考慮してください。
一致するすべてのファイル(存在する場合)でsed
内部置換()を実行する必要があります。-i
xargs -r
答え2
これはうまくいきます。
/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つのケースに制限できます。
- 輸入金持ち
- モジュールからインポート金持ち
- 定義金持ち
- 金持ち(
しかし、
- くそ_フー
- クソ金持ち(
- くそ 1foo(
- クソ金持ち(
その後、コマンドは次のようになります。
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" \;
答え3
検索したいディレクトリにあるとします(すべてのサブディレクトリとも一致します)。
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