Рекурсивный поиск-замена с использованием sed с URL-адресами

Рекурсивный поиск-замена с использованием 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, мое внутреннее ОКР действительно хочет знать, как это сделать правильно. Примечание: я работаю локально на Mac, но также буду выполнять это на Linux.

Любые идеи будут высоко оценены!

решение1

Решение 1: Один из способов — использовать findс xargs:

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

Решение 2: Другой вариант — использовать findс -exec, очень похоже на то, что в вашем вопросе:

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

Оба решения будут вызываться sedс несколькими файлами в качестве аргументов. Поэтому sedвызывается не один раз для каждого файла, а для каждого набора файлов.

Решение 3: Вместо 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'

Связанный контент