недійсний командний код. Незважаючи на періоди уникнення, використовуючи sed


187

Вимушений використовувати CVS для поточного клієнта, а адресу змінили для віддаленого репо. Єдиний спосіб змінити віддалену адресу в моєму локальному коді - це рекурсивний пошук та заміна.

Однак з командою sed я очікував би працювати:

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

Я отримую помилку для кожного файлу:

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

Я намагався уникнути періодів у матчі / заміні sed, але це нічого не вирішує.

Відповіді:


476

Якщо ви перебуваєте на 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/" {} \;

Дивіться це .


41
Якщо ви витратили 10 хв, як я знайшов різницю, це -e варіант
acheron55

9
Це питання відповідає RE error: illegal byte sequenceна MacOS.
JonasVautherin

11
Я використав порожній рядок '' як параметр для -i, і це спрацювало, як-отsed -i '' 's/blah/xx/g'
П'єр Х'юстон,

25
Для мене, додавши -eпісля -iзробленого sedрезервного копіювання всі мої файли таким чином: "foo.txt" -> "foo.txt-e". Очевидно, що я хотів, швидше -i '', тобто не створюйте резервні копії змінених файлів.
mdup

3
Ця ж проблема для мене. Це в -i -eпоєднанні з findрезультатом закінчення багатьох файлів -e-e-e-e-e-e-e.
аспікт

39

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

Звичайно, це означає, що ви не хочете створювати резервні копії файлів; в іншому випадку надайте розширення на вибір, наприклад -i .bak.


6

В OS X ніщо не допомагає бідному вбудованому сіду стати адекватним. Рішення таке:

brew install gnu-sed

А потім використовуйте gsed замість sed, який буде просто працювати, як очікувалося.


1
Дякую за цю відповідь, яка чудово працювала для мене! Працюючи як на Linux, так і на Mac, я б більше віддав перевагу доступному знайомому інструменту, ніж вивченню таємних відмінностей між двома тісно пов'язаними.
Стівен Шенк

3

Можливо, ваш новий домен містить /? Якщо це так, то спробуйте використовувати роздільник, крім /в sed, наприклад #, і ,т.д.

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

Також було б добре укласти s///в одну пропозицію, а не в подвійну цитату, щоб уникнути змінної підстановки чи будь-якої іншої несподіваної поведінки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.