web-dev-qa-db-ja.com

再帰的な検索-sedとURLを使用した置換

完全なURLスキームを置き換える必要のあるファイルのセットがたくさんあります。一部のファイル名にはスペースが含まれています。多くの検索と試行錯誤の末、これは私が来た中で最も近いものです。

find /somedir -type f -print0 -exec sed -i'' -e 's#http\\:\\/\\/domain.com#https\\:\\/\\/www.domain.com#g' {} +

結果のファイルでは、スキームhttp:が削除され、//が残ります。つまり、「// www.domain.com」です。

さらに、ファイル名に-eを追加して、新しいファイルが作成されます。 -つまり、明らかに不要なsome file.php-e

これは確かに十分ですが(*-eファイルを削除した後、私のOCDはこれを正しく行う方法を本当に知りたがっています。注:私はMacでローカルに作業していますが、Linuxでもこれを実行します。

どんなアイデアでも大歓迎です!

3
Chris Chapman

解決策1:1つの方法は、findxargsとともに使用することです。

find /dir -type f -print0 | xargs -0 sed -i 's#http://domain.com#https://www.domain.com#g'

解決策2:もう1つは、find-execと一緒に使用することです。これは、質問と非常によく似ています。

find /dir -type f -exec sed -i 's#http://domain.com#https://www.domain.com#g' {} +

どちらのソリューションも、引数として複数のファイルを使用してsedを呼び出します。したがって、sedは、すべてのファイルに対して1回ではなく、すべてのファイルセットに対して呼び出されます。

ソリューションsedの代わりに、検索-置換-ジョブにPerlを使用することもできます。

Perl -i -pe 's#http://domain.com#https://www.domain.com#g' file

find/xargsコマンドと組み合わせる:

find /dir -type f -print0 | xargs -0 Perl -i -pe 's#http://domain.com#https://www.domain.com#g'
2
chaos