Недопустимый код команды., несмотря на экранирование, используя 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 заменял
'
по
’
в баш.