Linux 单引号内的sed命令字符串变量串联

Linux 单引号内的sed命令字符串变量串联,linux,sed,concatenation,Linux,Sed,Concatenation,我想使用sed修改php.ini文件中的include_path指令。下面,我有一个命令,它查找字符串,并在匹配后将指令放在一行上。但是,在${install\u path}变量中保持双引号的同时,我无法让它工作。双引号必须在那里 我要编辑的文件是php.ini。下面是我的目标前后的几行,即“UNIX:”后面的几行: 安装路径定义为: install_path="/var/www/mainapp" 下面使用的sed命令搜索字符串匹配,然后在其正下方创建新行: sed -i '/; UNIX:

我想使用sed修改php.ini文件中的include_path指令。下面,我有一个命令,它查找字符串,并在匹配后将指令放在一行上。但是,在${install\u path}变量中保持双引号的同时,我无法让它工作。双引号必须在那里

我要编辑的文件是php.ini。下面是我的目标前后的几行,即“UNIX:”后面的几行:

安装路径定义为:

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_路径行是在“UNIX:…”行之后创建的


谢谢您的帮助。

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
,或者使用GNU awk预先使用
-i inplace

您的主要问题是在保留文件中的引号的同时,绕开shell的引号约定

你说你已经定义了
install_path=“/var/www/mainapp”
;请注意,shell删除了引号,因此字符串不包含引号。这在下面很重要。比较新旧版本:

旧的:

新的:

呃什么??您已经正确地将脚本括在单引号中,但这会阻止shell扩展
${install\u path}
。因此,您必须终止单引号字符串,但您希望在输出中使用双引号,因此我将单引号放在双引号之后。然后我将
${install\u path}
中的值也用双引号括起来:
“${install\u 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

编辑您的问题,以包括一些可测试的示例输入和预期输出。还向我们展示了如何填充
install\u path
变量。我已经对其进行了编辑,以获得install\u路径定义和预期结果。谢谢。显示输出是我们需要的一半-也显示输入。另外,在您想要更改的行周围显示几行上下文,因为更改您想要更改的部分总是微不足道的,但不更改您不想更改的其他部分要困难得多。我添加了install_path变量的定义。这实际上是进入sed命令的唯一输入。不,这只是希望脚本用于帮助将输入转换为输出的变量。在运行脚本之前,输入是文件
php.ini
的内容。您不必显示整个文件,只需显示您要查找的行和前后的几行,这样我们就可以测试潜在的解决方案,以确保它完全生成您认为应该的输出(因此,确保您的预期输出还包括未更改的上下文行,如果这是您想要的).我已将问题编辑为包含输入和输出。谢谢到目前为止,您已经包含了输出,但仍然没有向我们显示生成该输出的输入。我希望这个脚本能做你想做的。谢谢你的时间和帮助@Jonathan Leffler answer坚持使用sed,效果很好。我只是缺少bash脚本中使用的引用约定。不客气,但这不是sed的工作。使用sed除了在单个行上进行简单替换外,其他任何操作都像是用茶匙种树。是的,你可以做到,但在某个时候你会想拿起一把铲子…惊人的详细信息!工作得很有魅力。非常感谢-我对bash脚本中的引用约定不太熟悉。
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