如何使用bash在两个已知行块(如果之前尚未插入)之间的文件中插入一行?

Luc*_*one 5 bash awk sed file-manipulation

我写了一个bash脚本,可以根据我的需要修改php.ini.
现在我必须引入一个新的变化,我找不到一个明确的解决方案.

我需要修改php.ini才能插入(如果以前没有插入的话)

extension="memcache.so" 
Run Code Online (Sandbox Code Playgroud)


块之间

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
Run Code Online (Sandbox Code Playgroud)

和块

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
Run Code Online (Sandbox Code Playgroud)

可能就在第二个之前.
有人可以帮我吗?提前致谢

编辑:使用解决

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
Run Code Online (Sandbox Code Playgroud)

Sjo*_*erd 6

使用grep -n以下代码获取行号:

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

计算要将文本插入的行:

line=$((line - 3))
Run Code Online (Sandbox Code Playgroud)

使用sed或awk插入它.在第45行插入"换行符"的示例:

sed '45i\newline' file
awk 'NR==45{print "newline"}1'
Run Code Online (Sandbox Code Playgroud)


pot*_*ong 5

这可能对你有用:

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

这将插入到和extension="memcache.so"之间,除非已经存在。; Dynamic Extensions ;; Module Settings ;extension="memcache.so"