niepoprawny kod polecenia, pomimo upływu kropek, używając sed

187

Zmuszenie do używania CVS dla bieżącego klienta i zmiana adresu dla zdalnego repozytorium. Jedynym sposobem, w jaki mogę zmienić zdalny adres w moim lokalnym kodzie, jest wyszukiwanie rekurencyjne i zamiana.

Jednak przy użyciu komendy sed spodziewałbym się, że zadziała:

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

Otrzymuję błąd dla każdego pliku:

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

Próbowałem uciec przed kropkami w meczu sed / zamianie, ale to nic nie rozwiązuje.

helion3
źródło

Odpowiedzi:

476

Jeśli korzystasz z systemu OS X, prawdopodobnie nie ma to nic wspólnego z poleceniem sed. W wersji OSX z sedThe -iopcja oczekuje extensionargumentu więc komenda jest analizowany jakoextension argument i ścieżka do pliku jest interpretowana jako kodu poleceń.

Spróbuj dodać -eargument jawnie i podać ''jako argument do -i:

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

Zobacz to .

damienfrancois
źródło
41
Jeśli spędziłeś 10 minut, tak jak ja, znajdując różnicę, jest to opcja -e
acheron55
9
To pytanie odpowiada RE error: illegal byte sequencena MacOS.
JonasVautherin
11
użyłem pustego ciągu „” jako parametru -i i to zadziałało, jaksed -i '' 's/blah/xx/g'
Pierre Houston,
25
Dla mnie, dodając -epo -iwykonanej sedkopii zapasowej wszystkie moje pliki w ten sposób: „foo.txt” -> „foo.txt-e”. Oczywiście chciałem raczej -i '', tzn. Nie tworzyć kopii zapasowych zmienionych plików.
mdup
3
Ten sam problem dla mnie. W -i -epołączeniu z tym findwiele plików kończyło się na -e-e-e-e-e-e-e.
aspyct
39

Po prostu zapomniałeś podać argument -i. Po prostu zmień -ina -i ''.

Oczywiście oznacza to, że nie chcesz tworzyć kopii zapasowej plików; w przeciwnym razie podaj swoje rozszerzenie wyboru, np -i .bak.

mdup
źródło
6

W OS X nic nie pomaga, aby słaba wbudowana wersja stała się wystarczająca. Rozwiązaniem jest:

brew install gnu-sed

A następnie użyj gsed zamiast sed, który będzie działał zgodnie z oczekiwaniami.

Dmitrij Mikushin
źródło
1
Dziękuję za tę odpowiedź, która zadziałała dla mnie świetnie! Pracując zarówno na Linuksie, jak i na Macu, wolałbym dostęp do znanego narzędzia niż uczenie się tajemniczych różnic między dwoma blisko powiązanymi.
Stephen Shank
3

Prawdopodobnie Twoja nowa domena zawiera /? Jeśli tak, spróbuj użyć separatora inny niż /w sednp #, ,etc.

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

Dobrze byłoby również zawrzeć s///pojedynczy cytat zamiast podwójnego cytatu, aby uniknąć substytucji zmiennych lub innych nieoczekiwanych zachowań

jkshah
źródło