Недопустимый код команды., несмотря на экранирование, используя sed

Будучи вынужденным использовать CVS для текущего клиента, а адрес изменился для удаленного репо. Единственный способ найти удаленный адрес в моем локальном коде - это рекурсивный поиск и замена.

Тем не менее, с командой sed я ожидал работать:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

Я получаю сообщение об ошибке для каждого файла:

sed: 1: ".//file/path ...": invalid command code .

Я пытался избежать периодов в Sed Match / замене, но это ничего не решает.

6 ответов

Решение

Если вы работаете в OS X, это, вероятно, не имеет ничего общего с командой sed. На OSX версии sed, -i вариант ожидает extension аргумент, так что ваша команда на самом деле анализируется как extension аргумент и путь к файлу интерпретируется как код команды.

Попробуйте добавить -e аргумент явно и давая '' в качестве аргумента -i:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \;

Смотрите это.

В OS X ничто не помогает бедному встроенному sed стать адекватным. Решение такое:

brew install gnu-sed

А затем используйте gsed вместо sed, который будет работать должным образом.

Вы просто забыли предоставить аргумент -i, Просто поменяй -i в -i '',

Конечно, это означает, что вы не хотите, чтобы ваши файлы были скопированы; в противном случае укажите расширение вашего выбора, например -i .bak,

Просто добавьте расширение к флагу -i. Это в основном создает файл резервной копии с исходным файлом.

sed -i.bakup 's/linenumber/number/' ~/.vimrc

sed выполнится без ошибок

Возможно, ваш новый домен содержит /? Если это так, попробуйте использовать разделитель, кроме / в sedнапример, #, , и т.п.

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;

Также было бы хорошо приложить s/// в одинарных, а не в двойных кавычках, чтобы избежать подстановки переменных или любого другого непредвиденного поведения

Это не относится к ОП, но это было для меня и могло помочь кому-то другому.

Если вы используете регулярное выражение для заключения, дважды проверьте символы. Я копировал и вставлял сценарий, а OSX заменял 'по в баш.

Другие вопросы по тегам