Различия между sed #,%, / и |

Вы передаете только stdout на grep, но ваш curl выдает ошибки на stderr, которые печатаются без прохождения grep. Если вы хотите, чтобы stderr тоже фильтровался, перенаправьте его сначала на stdout.

1
05.06.2017, 00:34
1 ответ

Команда замены 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' {} +
4
27.01.2020, 23:45

Теги

Похожие вопросы