ファイル内で一致するすべての文字列を再帰的に置き換えるには?

ファイル内で一致するすべての文字列を再帰的に置き換えるには?

フォルダ名siteの下に約50個のHTML / jsファイルがあります。

一部のファイルには以下が含まれます(次の行はファイル内で組み合わされます)

    {"rendered":"http:\/\/localhost:4542\/?page_id=854"}
                 http:\/\/localhost:4542\/wp-content\/uploads\/2022\/09\/
           src=\"http:\/\/localhost:4542\/wp-content\/uploads\/2022\/09\/B
                 http:\/\/localhost:4542\/wp-content\/uploads\/2022\/09\/A
replies":[{"embeddable":true,"href":"http:\/\/localhost:4542\/en\/wp-json  

フォルダ内のすべてのファイルを繰り返し変更できるツール/コマンドはありますかhttp:\/\/localhost:4542https:example.com

これでmacOSで作業しています。

答え1

持ち運べる:

LC_ALL=C find . '(' -name '*.[Jj][Ss]' -o \
                    -name '*.[Hh][Tt][Mm][Ll]' -o \
                    -name '*.[Hh][Tt][Mm]' \
                ')' -exec perl -pi -e '
  s{\Qhttp:\/\/localhost:4542\E}{https:example.com}g' {} +

置き換えるファイルがまったくないファイルを再作成することに注意してください。

GNU grep/xargsまたは互換性(ここでは過度の入力を避けるために中括弧拡張をサポートするシェル)の場合は、これを回避できます。

LC_ALL=C grep -r --include='*.'{'[jJ][sS]','[Hh][Tt][Mm]'{,'[Ll]'}} \
  -Fl --null 'http:\/\/localhost:4542' . |
  xargs -r0 perl -pi -e '
    s{\Qhttp:\/\/localhost:4542\E}{https:example.com}g'

大きなダメージなしで削除するオプション(ファイルが見つからない場合はPerl警告のみを表示)に加えて、-rGNU APIの大部分をコピーするMacosでも動作します。xargsgrepgrep

答え2

findパラメータと一緒にコマンドを試すことができます-exec

find /path/to/folder -type f -regex '.*\.\(js\|html\)' -exec sed -i 's#http:\\/\\/localhost:4542#https:example.com#g' {} +

Mac OSでは、同様の構文を使用できます。

find /path/to/folder -E -type f -regex '.*\.(js|html)' -exec sed -i '.bak' 's#http:\\/\\/localhost:4542#https:example.com#g' {} +

本当にうまくいってください。テストするMacはありませんが、動作します。 Mac OSでは、-iこのオプションを指定するときにファイル拡張子をバックアップする必要があります。 ".bak"の代わりに任意の値を使用できます。

クレジット取引:

find コマンドを使用して複数の拡張子を検索する方法

Macで-iオプションを含むsedコマンドが失敗する

メモ:このコードがMac OSで動作するかどうかはわかりませんが、次のように試すこともできます。

find /path/to/folder -iname "*.html" -o -iname "*.js" -exec sed -i 's#http:\\/\\/localhost:4542#https:example.com#g' {} +

答え3

特定のフォルダ(たとえば)で特定の種類(たとえば)のすべてのファイルをfind見つけて、次のコマンドを使用してコマンドに入力できます。*.txt.sedxargs

find .  -type f -name '*.txt' -print0 | xargs -0 sed -i 's/http:\\\/\\\/localhost:4542/https:example.com/g'

上記のスラッシュがエスケープされていることに注意してください。

関連情報