使用 sed 本身作为替换的 Bash sed 命令,不输出引号

使用 sed 本身作为替换的 Bash sed 命令,不输出引号

我需要使用以下 sed 命令(运行良好)来修改文件的内容:

sed -i '[email protected].*@'"date.timezone = $TZ"'@' $PHP_INI_DIR/conf.d/symfony.ini

此行应该在脚本中注入exec

#!/bin/sh
set -e

exec "$@"

所以我需要另一个 sed 来表示“之前替换exec”:

sed '/exec/i \sed -i '[email protected].*@'"date.timezone = $TZ"'@' $PHP_INI_DIR/conf.d/symfony.ini\n' docker-php-entrypoint

问题是引文不是输出

#!/bin/sh
set -e

sed -i [email protected].*@"date.timezone = $TZ"@ $PHP_INI_DIR/conf.d/symfony.ini

exec

\在前面加反斜杠没有任何作用。有什么建议吗?'[email protected]

答案1

这是 shell 问题。shell 会“删除引号”,因此您需要研究引号在 shell 中的行为方式。单引号不能嵌套或转义。您必须结束单引号字符串才能插入单引号。

sed '/exec/i \sed -i '\''[email protected].*@'\''"date.timezone = $TZ"'\''@'\'' $PHP_INI_DIR/conf.d/symfony.ini\n'

答案2

您可以在单引号内使用双引号,反之亦然,以转义引号:

sed '/exec/i \sed -i '"'"'[email protected].*@"date.timezone = $TZ"@' $PHP_INI_DIR/conf.d/symfony.ini\n'"'"' docker-php-entrypoint

这样,单引号在单引号内进行转义,双引号在转义的单引号内使用。

相关内容