2013-12-13 16 views
22

Szukałem w Internecie tej odpowiedzi i nie mogę jej znaleźć.Jak używać sed do zamiany zmiennej pliku konfiguracyjnego?

Mam plik konfiguracyjny zawierający:

VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE5 
VAR6=VALUE6 

I chcę zmienić wartość VAR5 jest od VALUE5 do VALUE10. Niestety nie znam wartości VALUE5, więc nie mogę jej wyszukać. Zasadniczo potrzebuję użyć sed (lub cokolwiek innego), aby zastąpić wartość VAR5 dowolną wartością, którą chcę zastąpić.

Edytuj: Dzięki potwierdzonemu rozwiązaniu udało mi się użyć następujących w BASH, aby edytować mój plik konfiguracyjny, przekazując argument do skryptu Bash. Ukośniki zostały zastąpione przecinkami, ponieważ parametr, który przekazuję do skryptu, zawiera ukośniki.

sed -i 's,^\(THISISMYVARIABLE=\).*,\1'THISISMYVALUE',' config.cfg 

Mój plik zawierał:

THISISMYVARIABLE=SOMEOLDVALUE 

Po uruchomieniu komendy sed w bash

THISISMYVARIABLE=THISISMYVALUE 
+0

Skąd pochodzi "VALUE10"? Czy pochodzi z innej linii w tym samym pliku? A może jest to tylko dowolna wartość? – Sildoreth

+0

VAR5 w moim pliku konfiguracyjnym to USER_INSTALL_DIR, a VALUE10 to wszystko, może to być śmieci. Chcę ustawić VAR5 lub w moim przypadku USER_INSTALL_DIR na zmienną, którą przechodzę do niej poprzez skrypt bash. Poniższy pracował dla mnie dzięki komentarzowi anubhava. Zamieniłem również ukośniki przecinkami, ponieważ parametr, który przyjmie mój skrypt basha, będzie zawierał ukośniki, ponieważ przechodzą one przez katalog użytkownika. – SomeGuyOnAComputer

Odpowiedz

32

Można spróbować to sed:

sed -i.bak 's/^\(VAR5=\).*/\1VALUE10/' file 

Daje:

VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 
+3

+1. Chcę tylko podać inny, odrobinę prostszy (ale słabszy, działa tylko wtedy, gdy dokładnie wiemy początek): 'sed -i.bak 's/^ VAR5 =. */VAR5 = VALUE10 /' file' –

+0

Problem przy obu tych odpowiedziach wymaga to znajomości wartości VAR5. W moim przypadku nie znasz wartości VAR5, więc chcesz znaleźć "VAR5 =" i znaleźć ciąg pomiędzy tym a nowym wierszem. – SomeGuyOnAComputer

+1

Wartość 'VAR5' była w twoim przykładzie" VALUE5 "i ta odpowiedź nie potrzebowała znać" VALUE5 " – anubhava

3

Można powiedzieć:

sed '/^VAR5=/s/=.*/=VALUE10/' filename 

Aby w zmianie do pliku w miejscu, należy wybrać opcję -i:

sed -i '/^VAR5=/s/=.*/=VALUE10/' filename 
0

Wypróbuj następujące

sed -r 's/^ (VAR5 =). */\ 1REPLACEMENT /'

Wartość VAR5 zostanie zastąpiona przez WYMIANĘ.

1
sed '/\(^VAR5=\).*/ s//\1VALUE10/' YourFile 

W AIX/KSH

$ cat sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE5 
VAR6=VALUE6 

$ sed '/\(^VAR5=\).*/ s//\1VALUE10/' sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 

oraz wymiany w pliku

cat <> YourFile | sed '/\(^VAR5=\).*/ s//\1VALUE10/' 

$ cat <> sample.txt | sed '/\(^VAR5=\).*/ s//\1VALUE10/' 
$ cat sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 

Aby POSIX (na sed części nie cat) zgodny (SED --posix na gnu sed i natywny tradycyjne sed na systemie non-linux)

+1

Nie ma nic POSIX o [bezużyteczne użycie 'cat'] (http : //partmaps.org/era/unix/award.html). Również ten diament "<>" wygląda zupełnie nie na miejscu. – tripleee

4

Nawet t Odpowiedź na to pytanie została dodana.Spędziłem trochę czasu na, jak to działa, chciałbym dodać kilka faktów i moją wersję odpowiedzi,

sed -i 's,^\(THISISMYVARIABLE[ ]*=\).*,\1'THISISMYVALUE',g' config.cfg 

Objaśnienie:

  • jako podstawowy z sed 's/find_this/replace_with/' mówimy sed, aby wyszukać i wymienić. Pamiętaj również, że istnieje wiele innych ograniczników, których możemy użyć zamiast /. Użyto tutaj ,.
  • Tutaj znajduje się linia pasująca do ^\(THISISMYVARIABLE[ ]*=\).*. Oznacza to, że grupujemy mecz THISISMYVARIABLE[ ]*=. ([ ]* do pokrycia, jeśli są jakieś spacje po klawiszu)
  • W części zamiennej \1 jest odniesieniem wstecz. Odwołujemy się do pierwszej grupy w wyrażeniu regularnym, którego użyliśmy do dopasowania.
+0

THISISMYVALUE jest bez cudzysłowów zgodnie z op. Dlaczego przestrzenie przed równym, wydają się zbyt duże! Reszta jest ważna, referencja zwrotna jest właściwą nazwą. – Timo

Powiązane problemy