5

I wrote a bash script which can modify php.ini according to my needs.
Now I have to introduce a new change, and I cannot find a clear solution to it.

I need to modify php.ini in order to insert (if not already inserted previously)

extension="memcache.so" 


between the block

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

and the block

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

possibly just before the second one.
Can anyone help me please? Thanks in advance

EDITED: solved by using

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
Luca Borrione
  • 15,077
  • 5
  • 48
  • 61

3 Answers3

6

Get the line number using grep -n:

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

Calculate the line to insert the text to:

line=$((line - 3))

Insert it using sed or awk. Examples to insert "newline" on line 45:

sed '45i\newline' file
awk 'NR==45{print "newline"}1'
Sjoerd
  • 68,958
  • 15
  • 118
  • 167
4

This might work for you:

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

This will insert extension="memcache.so" between ; Dynamic Extensions ; and ; Module Settings ; unless extension="memcache.so" is already present.

potong
  • 47,186
  • 6
  • 43
  • 72
  • Nice, thank you. Anyhow, in this specific example, I need to add `extension="memcache.so"` unless the same extension hasn't been added before ... other extensions might be (and actually are) present. – Luca Borrione Jan 23 '12 at 14:52
  • I think you mean "... _if_ the same extension hasn't been added before". Have amended the solution to reflect your comment. – potong Jan 23 '12 at 15:21
  • sorry! Yes: that what I meant :) .. your code now is adding `extension="memcache.so"` all the times even if already present .. – Luca Borrione Jan 23 '12 at 16:26
  • Cut-n-paste caught me out! Had an extra `=`. Solution amended – potong Jan 23 '12 at 19:13
2

You can use the following sed script:

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

Basically it matches these lines:

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

and inserts before them the desired string (extension="memcache.so")

jcollado
  • 35,754
  • 6
  • 94
  • 129
  • sorry, I can't understand how to use your suggestion. Which would be the command to fire? – Luca Borrione Jan 23 '12 at 13:52
  • @LucaBorrione Save the script in a file and execute `sed -f php.ini`. This will print to stdout, if you want to make the changes in place, use also `-i`. – jcollado Jan 23 '12 at 13:55
  • Thank you it's working fine. Never done such a thing before. One never stops to learn. A great thank! – Luca Borrione Jan 23 '12 at 14:06