Bash 将带有特殊字符的配置插入 wp-config.php

Bash insert config with special characters into wp-config.php

我正在尝试将用于获取我们网站访问者的(大概)真实 IP 的配置插入到他们各自的 wp-config.php,但我遇到了大量问题涉及的特殊字符数。

我计划将此添加到一个 bash 脚本中,该脚本可以快速启动新的 Wordpress 安装,但实际上我必须在每次安装后手动添加该行。

这是配置...

$_SERVER['REMOTE_ADDR'] = preg_replace('/^([^,]+).*$/', '', $_SERVER['HTTP_X_FORWARDED_FOR']);

wp 的 snipit-config.php:

$table_prefix = 'wp_';

define('WPLANG', '');



/* That's all, stop editing! Happy blogging. */ 

我最初认为我可以使用 sed 在 "define('WPLANG', '');" 下的空白处插入配置,就像我完成其他类似任务一样...

find="define('WPLANG', '');"
replace="$_SERVER['REMOTE_ADDR'] = preg_replace('/^([^,]+).*$/', '', $_SERVER['HTTP_X_FORWARDED_FOR']);"

sed "s/$find\n\n/$find\n$replace/"

...但是特殊字符正在抛弃一切。我尝试了多种不同的引用和转义方式,但我没有任何运气。

您可以使用 awk 轻松完成此操作:

awk -vrep="$replace" '{print}/define.*WPLANG/{print RS rep}' wp-config.php

这将无条件打印每一行。当包含 "define" 和 "WPLANG" 的行被匹配时,它还会打印 shell 变量 $replace 的值,并在它之前换行。

为了避免 bash 中的转义字符出现问题,您可以将 cat 与 HEREDOC 一起使用:

replace=$(cat <<'EOF'
$_SERVER['REMOTE_ADDR'] = preg_replace('/^([^,]+).*$/', '', $_SERVER['HTTP_X_FORWARDED_FOR']);
EOF
)

'EOF'两边的单引号表示字符串中的字符按字面解释。