2012-01-23 6 views
5

Napisałem skrypt bash, który może modyfikować php.ini zgodnie z moimi potrzebami.
Teraz muszę wprowadzić nową zmianę i nie mogę znaleźć jasnego rozwiązania.

trzeba zmodyfikować php.ini do wkładki (jeśli nie jest już włożona wcześniej)
Jak wstawić linię do pliku między dwoma blokami znanych linii (jeśli nie zostały wcześniej wstawione), używając bash?

extension="memcache.so" 


pomiędzy blokiem

;;;;;;;;;;;;;;;;;;;;;; 
; Dynamic Extensions ; 
;;;;;;;;;;;;;;;;;;;;;; 

i blokiem

;;;;;;;;;;;;;;;;;;; 
; Module Settings ; 
;;;;;;;;;;;;;;;;;;; 

prawdopodobnie tuż przed drugim.
Czy ktoś może mi pomóc? Dzięki z góry

edycja: rozwiązać za pomocą

if ! grep -Fxq 'extension="memcache.so"' 'php.ini'; then 
    line=$(cat 'php.ini' | grep -n '; Module Settings ;' | grep -o '^[0-9]*') 
    line=$((line - 2)) 
    sudo sed -i ${line}'i\extension="memcache.so"' 'php.ini' 
fi 

Odpowiedz

6

Uzyskaj numer wiersza przy użyciu grep -n:

line=$(cat php.ini | grep -n 'Module Settings' | grep -o '^[0-9]*') 

Oblicz linię, aby wstawić tekst:

line=$((line - 3)) 

Wstaw go za pomocą sed lub awk. Przykłady wstawianie "przełamane" na linii 45:

sed '45i\newline' file 
awk 'NR==45{print "newline"}1' 
+0

Dziękuję Rozwiązałem problem z używaniem (patrz edytowane) –

2

Można użyć następującego sed skryptu:

/^;\+$/{ 
N 
/^;\+\n; Module Settings ;$/i extension="memcache.so" 
} 

zasadzie pasuje te linie:

;;;;;;;;;;;;;;;;;;; 
; Module Settings ; 

i wkładki przed nimi pożądany ciąg (extension="memcache.so")

+0

Niestety, nie rozumiem, jak użyć tej sugestii. Który rozkaz byłby strzelać? –

+0

@ LucaBorrione Zapisz skrypt w pliku i wykonaj 'sed -f php.ini'. Spowoduje to wydrukowanie na standardowe wyjście, jeśli chcesz wprowadzić zmiany na miejscu, użyj również '-i'. – jcollado

+0

Dziękuję, że działa dobrze. Nigdy wcześniej tego nie robiłem. Nigdy nie przestaje się uczyć. Wielkie dzięki! –

4

To może działać dla Ciebie:

sed '/^; Dynamic Extensions ;$/,/^; Module Settings ;$/{H;//{x;/extension="memcache.so"/{p;d};/;;;\n/{s//&extension="memcache.so"\n/p}};d}' file 

To będzie wstawić extension="memcache.so" między ; Dynamic Extensions ; i ; Module Settings ; chyba extension="memcache.so" jest już obecny.

+0

Dobrze, dziękuję. W każdym razie w tym konkretnym przykładzie muszę dodać 'extension =" memcache.so "', chyba że to samo rozszerzenie nie zostało dodane przed ... innymi rozszerzeniami mogą być (i faktycznie są) obecne. –

+0

Myślę, że masz na myśli "... _if_ to samo rozszerzenie nie zostało dodane przed". Zmieniono rozwiązanie, aby odzwierciedlić Twój komentarz. – potong

+0

Przepraszam! Tak: to, co miałem na myśli :) .. Twój kod teraz dodaje 'extension =" memcache.so "' cały czas, nawet jeśli już jest obecny. –

Powiązane problemy