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

Ответ 1

Если вы находитесь на 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/" {} \;

См. .

Ответ 2

Вы просто забыли указать аргумент -i. Просто измените -i на -i ''.

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

Ответ 3

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

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

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