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?
sed -ie "s/${VAR1}/${VAR2}/g" postgresql.conf
sed -e '/shared_buffers /s/=[^#]*/= 8GB /'
lub podobna?bash -x
powinno wskazywać, co zrobiłeś źle.Odpowiedzi:
Zwykle przyczyną jest to, że jedna (lub obie) zmienne zawiera ogranicznik (w twoim przypadku
/
). Możeszzmień separator, jeśli masz alternatywny znak, który nie będzie obecny:
lub
zamień separator w zmiennych:
Mogą istnieć inne zamienniki, które musisz również wprowadzić,
$VAR1
jeś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_buffers
w pliku konfiguracyjnym na stałą wartość8GB
, w którym to przypadku nie potrzebujesz żadnych zmiennych:Możesz to odczytać, jak w każdej linii, która zaczyna się od
shared_buffers
i poziome spacje, a następnie zamień pierwsze=
i następne słowo= 8GB
, co wydaje się być tym, czego chcesz.źródło