问题
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
回答1:
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'
回答2:
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.
回答3:
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"
)
来源:https://stackoverflow.com/questions/8971314/how-to-insert-a-line-in-a-file-between-two-blocks-of-known-lines-if-not-already