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

无人久伴 提交于 2019-11-27 07:03:25

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!