2015-08-24 44 views
0

我想使用sed在我的php.ini文件中修改include_path指令。下面,我有一个命令查找一个字符串,并将匹配后的指令放在一行中。但是,我仍然无法在保持$ {install_path}变量中的双引号的同时继续工作。双引号必须在那里。单引号内的sed命令字符串变量连接

我想编辑的文件是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:。...”

感谢您的帮助

+0

编辑您的问题以包含一些可测试的示例输入和预期输出。同时向我们展示如何填充'install_path'变量。 –

+0

我已经编辑它以具有install_path定义和预期结果。谢谢。 – Freddie

+0

显示输出是我们需要的一半 - 显示输入。另外,还可以在要更改的行的周围显示几行上下文,因为更改要更改的部分通常很简单,但很难更改其他不需要更改的部分。 –

回答

1

。您的主要问题是围绕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 

另外请注意,只有GNU sed让你把“附加文本”在与a命令相同的行上。 POSIX sed没有,其他平台上的其他变体sed不会。例如,在Mac OS X上,您必须编写以下代码:

sed -i '/; UNIX: "\/path1:\/path2"/a\ 
include_path = '"${install_path}/lib" /etc/php.ini 
+0

令人惊叹的详细信息!像魅力一样工作。非常感谢 - 我不熟悉bash脚本中的引用约定。 – Freddie

0

sed的是个人行简单的换人,这是所有对于任何稍微更有趣,你应该用awk机会是你想要的东西一样。这样的:

awk -v install_path="$install_path" ' 
{ print } 
/; UNIX: "\/path1:\/path2"/ { printf "include_path = \"%s/lib\"\n", install_path } 
' /etc/php.ini 

,但没有样品的输入和预期的输出是一个猜测要替换原文件中的内容只是添加> tmp && mv tmp /etc/php.ini到年底或使用-i inplace前面用GNU AWK

+0

我编辑了我的问题以包含输入和输出。谢谢! – Freddie

+0

目前为止您已包含输出,但仍未向我们展示生成该输出的输入。不过我希望这个脚本能够做你想要的东西。 –

+0

感谢您的时间和帮助。 @Jonathan Leffler答案保持了sed的使用并且效果很好。我只是缺少在bash脚本中使用的引用约定。 – Freddie