5

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

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

extension="memcache.so" 


块之间

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

和块

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

可能就在第二个之前。
任何人都可以帮助我吗?提前致谢

编辑:通过使用解决

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
4

3 回答 3

6

使用获取行号grep -n

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

计算要插入文本的行:

line=$((line - 3))

使用 sed 或 awk 插入它。在第 45 行插入“换行符”的示例:

sed '45i\newline' file
awk 'NR==45{print "newline"}1'
于 2012-01-23T12:14:44.663 回答
4

这可能对您有用:

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

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

于 2012-01-23T14:11:12.467 回答
2

您可以使用以下 sed 脚本:

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

基本上它匹配这些行:

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

并在它们之前插入所需的字符串 ( extension="memcache.so")

于 2012-01-23T12:28:59.787 回答