Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to insert a line in a file between two blocks of known lines (if not already inserted previously), using bash?

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
like image 411
Luca Borrione Avatar asked Jan 23 '12 12:01

Luca Borrione


People also ask

How do I put two lines in a file in bash?

To add multiple lines to a file with echo, use the -e option and separate each line with \n. When you use the -e option, it tells echo to evaluate backslash characters such as \n for new line. If you cat the file, you will realize that each entry is added on a new line immediately after the existing content.

How do I add a new line to a file?

This appending task can be done by using 'echo' and 'tee' commands. Using '>>' with 'echo' command appends a line to a file. Another way is to use 'echo,' pipe(|), and 'tee' commands to add content to a file.

How do I add a line after a line in Linux?

Insert a line in a File You have to use the “-i” option with the “sed” command to insert the new line permanently in the file if the matching pattern exists in the file.


1 Answers

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'
like image 158
Sjoerd Avatar answered Oct 08 '22 16:10

Sjoerd