Вы передаете только stdout
на grep
, но ваш curl
выдает ошибки на stderr
, которые печатаются без прохождения grep
. Если вы хотите, чтобы stderr
тоже фильтровался, перенаправьте его сначала на stdout
.
Команда замены Sed обычноиспользует /
в качестве разделителя между командой s
, строкой поиска, строкой замены и любыми флагами. Однако, если строка поиска или строка замены может содержать /
, то люди изменят разделитель на символ, который не , а не ни в одной из строк.
Вы получили другую ошибку от sed, когда сказали использовать пустую строку в качестве расширения резервной копии; так как вы не используете расширение, не ставьте пустые кавычки.
Sed не волнует, какой разделитель, но окружающий шелл может.
Символ |
обозначает вертикальную черту. Чтобы использовать его в качестве разделителя, вам придется каким-то образом заключить его в кавычки, чтобы защитить их от оболочки.
Символ #
может вводить строку комментария в зависимости от вашей оболочки (bash начинает комментарий, только если #
является первым символом слова), поэтому лучше сейф и процитировать его.
Поскольку ваши данные содержат символы /
, вам нужно либо использовать другой разделитель, либо экранировать каждый экземпляр /
в строках поиска и замены. Это приводит к так называемому синдрому наклонной зубочисткииз-за плохо читаемого внешнего вида \/
.
Таким образом, вам понадобится что-то вроде:
find . -type f -name 'file.sql' -exec sed -i -e 's#http://a.com#http://b.com#g' {} +
или
find . -type f -name 'file.sql' -exec sed -i -e 's|http://a.com|http://b.com|g' {} +
или
find . -type f -name 'file.sql' -exec sed -i -e "s|http://a.com|http://b.com|g" {} +
или
find . -type f -name 'file.sql' -exec sed -i -e 's/http:\/\/a.com/http:\/\/b.com/g' {} +