2011-10-04 12 views
12

Jestem nowy w tworzeniu skryptów powłoki, ale otrzymuję ten błąd i nie mogę wymyślić co.Otrzymywanie błędu sed

sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 

Oto skrypt biegnę

for fl in $(S_convertPath ${RESOURCE_DIR}/db)/db.changelog-*xml; do 
    sed -i "s/HOSTNAME/${IP_ADDRESS}/g" $fl 
done 

Dzięki

Odpowiedz

43

Zważywszy, że sed wydaje się myśleć, że prowadzisz delete line polecenie (d), może chcesz na wyjściu polecenie, aby zobaczyć, co faktycznie jest w, że zmienna środowiskowa twoja:

for fl in $(S_convertPath ${RESOURCE_DIR}/db)/db.changelog-*xml; do 
    echo sed -i "s/HOSTNAME/${PSM_SERVER_ADDRESS}/g" $fl 
done 

Istnieje duża szansa, że ​​PSM_SERVER_ADDRESS uszkodzi twoje polecenie sed (i może wymagać przetworzenia, aby go wyczyścić). Jednym ze sposobów, aby to zrobić (pod warunkiem, że masz dość niedawno sed) byłoby użyć ograniczników, które nie pojawiają się w zmiennej środowiskowej, na przykład:

sed -i "s?HOSTNAME?${PSM_SERVER_ADDRESS}?g" $fl 

Ponieważ pan przyjął tę odpowiedź, ja może również dodać rozdzielczość dla dodatkowego problemu, który znalazłeś. Wygląda na to, że BSD sed, w przeciwieństwie do Linuksa, ma wymaganie , że podajesz rozszerzenie do opcji -i. Tak więc, podczas gdy Linux pozwala na:

sed -i "sed-command" 

edytować w miejscu, wariant BSD musi mieć:

sed -i "" "sed-command" 

z pustym zapasowej przyrostka.

Bez tego, sed może użyć twojego polecenia jako rozszerzenia i twojej pierwszej nazwy pliku jako polecenia.

+2

To jest. Wartość 'PSM_SERVER_ADDRESS' jest ścieżką (która zawiera'/'characters), więc polecenie s interpretuje te znaki'/'jako ograniczniki (np.' S/HOSTNAME // Users/davidkavanagh/path/g'. Wygląda jak nazwa alternatywna należy używać ograniczników. Być może 's @ HOSTNAME @ $ {PSM_SERVER_ADDRESS}/g'. – jamessan

+0

ADRES IP jest równy funkcji, która pobiera adres IP przy użyciu nazwy hosta -i, aby można ją było używać na wszystkich platformach – daverocks

+0

@daverocks, musisz wykonać skrypt Zapewniłem, że linia się powtórzy, nawet po dokonanych zmianach.To jedyny sposób, aby dowiedzieć się, jakie są polecenia dla "sed". – paxdiablo

Powiązane problemy