Sed: nieznana opcja dla `s '

1

Próbuję zmienić plik konfiguracyjny za pomocą skryptu bash. Używam polecenia sed, aby zmienić jak poniżej.

VAR1=$(cat postgresql.conf | grep "shared_buffers =" | cut -d# -f1)
VAR2=$(shared_buffers = 8GB)
sed -ie s/${VAR1}/${VAR2}/g postgresql.conf 

Próbowałem, ale dało mi to błąd.

sed: -e wyrażenie # 1, char 29: nieznana opcja na `s '

Czego brakuje?

Zawietrzny
źródło
Spróbuj użyć znaków cudzysłowu:sed -ie "s/${VAR1}/${VAR2}/g" postgresql.conf
Marco
Co próbujesz osiągnąć, czego nie rozwiązuje prostsza zamiana, taka jak sed -e '/shared_buffers /s/=[^#]*/= 8GB /'lub podobna?
Toby Speight
Śledzenie skryptu za pomocą bash -xpowinno wskazywać, co zrobiłeś źle.
Toby Speight
sed -ie "s / $ {VAR1} / $ {VAR2} / \ t / g" postgresql.conf Im za pomocą polecenia sed jak wyżej i działa, jednak ten, który zmieniłem, stał się shared_buffers = 8 GB # min 128kB jak to zrobić Dodam do tego zakładkę? @TobySpeight
Lee
Odpowiedź zaktualizowana za pomocą prostszego polecenia - pozostawia istniejące białe znaki na swoim miejscu.
Toby Speight

Odpowiedzi:

4

Zwykle przyczyną jest to, że jedna (lub obie) zmienne zawiera ogranicznik (w twoim przypadku /). Możesz

  • zmień separator, jeśli masz alternatywny znak, który nie będzie obecny:

    sed -e "s#${VAR1}#${VAR2}#g"

    lub

  • zamień separator w zmiennych:

    sed -e "s/${VAR1//\//\\/}/${VAR2//\//\\/}/g"

Mogą istnieć inne zamienniki, które musisz również wprowadzić, $VAR1jeśli chcesz dopasować je jako literał, ponieważ s///zawsze używa wyrażeń regularnych.


Jednak patrząc na to, co nam pokazałeś, wydaje się, że wszystko, co naprawdę próbujesz zrobić, to zmienić wartość przypisaną shared_buffersw pliku konfiguracyjnym na stałą wartość 8GB, w którym to przypadku nie potrzebujesz żadnych zmiennych:

sed -i -e '/^shared_buffers[ \t]/s/=[ \t]*[^# \t]\+/= 8GB/' /postgresql.conf

Możesz to odczytać, jak w każdej linii, która zaczyna się od shared_buffersi poziome spacje, a następnie zamień pierwsze =i następne słowo= 8GB , co wydaje się być tym, czego chcesz.

Toby Speight
źródło
Działa przy użyciu „sed -ie” s / $ {VAR1} / $ {VAR2} / g „postgresql.conf ', jakkolwiek między nimi jest linia, łączy zmiany, które wprowadziłem z linią
Lee