我想使用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"
在“; UNIX:...”行之后立即创建了include_path行
谢谢你的帮助。
您的主要问题是在保留文件中的引号的同时绕着shell的引用惯例跳舞。
你说你已经定义了install_path="/var/www/mainapp"
; 请注意,引号已被外壳删除,因此字符串不包含引号。这在下面很重要。比较新旧:
老的:
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
还要注意,只有GNUsed
允许您将“附加文本”放在a
命令的同一行。POSIXsed
不会,并且sed
其他平台上的POSIX的其他变体也不会。例如,在Mac OS X上,您必须编写:
sed -i '/; UNIX: "\/path1:\/path2"/a\
include_path = '"${install_path}/lib" /etc/php.ini
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句