linux - sed 命令字符串变量在单引号内串联

标签 linux sed concatenation

我想使用 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/

相关文章:

php - 在 CONCAT php mysql 更新中使用逗号

linux - 普通 block 设备上的类似 LVM 的快照

linux - 当两个进程使用同一个文件时,logrotate 如何工作?

linux - VFS 和 NFS 有什么区别?

c - 使用 exec() 系列运行 "cd"命令

bash - 在终端中格式化输出,删除空行并转换逗号

sed - 如何在命令行中使用带有 cut 的正则表达式?

ffmpeg - 合并视频文件后如何设置文件名(批处理脚本,FFMPEG)

python - FutureWarning : frame. 附加方法已弃用,请改用 pandas.concat

java - 无法从 Java 程序运行 UNIX 命令