我想使用 sed 修改 php.ini 文件中的 include_path 指令。下面,我有一个命令,用于查找字符串并将指令放在匹配后的一行上。但是,我无法让它工作,同时仍保留 ${install_path} 变量中的双引号。双引号必须存在。
我要编辑的文件是php.ini。这是我的目标之前和之后的几行,即“UNIX:”之后的行:
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
; UNIX: "/path1:/path2"
;include_path = "/path1:/path2"
;
; Windows: "\path1;\path2"
install_path 定义为:
install_path="/var/www/mainapp"
我在下面使用的 sed 命令搜索字符串匹配,然后在其正下方创建一个新行:
sed -i '/; UNIX: "\/path1:\/path2"/a include_path = "${install_path}/lib"' /etc/php.ini
php.ini 中的预期输出是:
; UNIX: "/path1:/path2"
include_path = "/var/www/mainapp/lib"
include_path 行是在“; UNIX:...”行之后创建的
感谢您的帮助。
最佳答案
您的主要问题是在保留文件中的引号的同时,围绕 shell 的引用约定跳舞。
你说你已经定义了install_path="/var/www/mainapp"
;请注意,引号已被 shell 删除,因此字符串不包含引号。下面这一点很重要。新旧对比:
旧:
sed -i '/; UNIX: "\/path1:\/path2"/a include_path = "${install_path}/lib"' /etc/php.ini
新:
sed -i '/; UNIX: "\/path1:\/path2"/a include_path = "'"${install_path}/lib"'"' /etc/php.ini
呃什么?您已正确地将脚本括在单引号中,但这会阻止 shell 扩展 ${install_path}
。因此,您必须终止单引号字符串,但您希望在输出中使用双引号,因此我将单引号放在双引号后面。然后我也用双引号将 ${install_path}
中的值括起来:"${install_path}/lib"
。双引号对于您引用的值并不重要,但一般来说使用它们是个好主意。然后我恢复单引号,第一个字符是 .ini
文件中包含路径字符串的结束双引号,然后结束单引号字符串。是的,还有其他方法可以写最后一点,但是需要相当多的说服力才能让我相信使用反斜杠的替代方案更好。
如果您确实保留了安装路径值周围的双引号:
install_path='"/var/www/mainapp"'
你可以使用:
sed -i '/; UNIX: "\/path1:\/path2"/a include_path = '"${install_path}/lib" /etc/php.ini
另请注意,只有 GNU sed
允许您将“附加文本”与 a
命令放在同一行。 POSIX sed
不会,其他平台上的 sed
的其他变体也不会。例如,在 Mac OS X 上,您必须编写:
sed -i '/; UNIX: "\/path1:\/path2"/a\
include_path = '"${install_path}/lib" /etc/php.ini
关于linux - sed 命令字符串变量在单引号内串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32192406/