我正在编写一个脚本来尝试加快我的基本Wordpress安装。它下载最新版本,解压缩它,更改客户端名称,然后更新配置文件中的一些文本。
但是,我在使用 sed 插入包含特殊字符的多行时遇到问题。多行来自WP密钥生成器 https://api.wordpress.org/secret-key/1.1/salt/,它们将取代标准
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
等。。。
这是给我带来问题的代码
# Download data to variable
salt="`curl https://api.wordpress.org/secret-key/1.1/salt/`"
sed -i "/NONCE_SALT/a $salt" $pname/wp-config-sample.php
我正在将生成的文本下载到一个变量,然后希望在标准文本的最后一个实例之后插入新行(我稍后将删除所有这些标准行)。它抛出一个错误;
"ed: -e expression #1, char 112: extra characters after command"
当我输入一行标准文本时,它很好。如果我在$salt
周围添加引号,它只会打印文件中的文字$salt
。
sed 是插入此数据的正确方法吗?请记住,我需要在文件中的特定点之后插入?
欢迎任何提示或提示。这是我第一次尝试 bash 脚本。
a
函数要求在字符串中的任何内部换行符之前使用反斜杠。因此,一种方法是使用sed
添加必要的反斜杠:
# Download data to variable, adding to all but the last line:
salt="$(curl https://api.wordpress.org/secret-key/1.1/salt/ | sed '$ ! s/$/\/')"
sed -i "/NONCE_SALT/a $salt" "$pname/wp-config-sample.php"
(请注意,我使用了$(...)
而不是`...`
:后者有痛苦的引用规则。在这种情况下,我将不得不写\\
而不是\
。
也就是说,在这种情况下,我认为将盐的东西保存到临时文件中可能更简单,并使用r
而不是a
:
# Download data to the file salt.txt:
curl https://api.wordpress.org/secret-key/1.1/salt/ > salt.txt
sed -i "/NONCE_SALT/r salt.txt" "$pname/wp-config-sample.php"
rm salt.txt # could also be done in a trap
试试这个:
awk -v salt="$(curl https://api.wordpress.org/secret-key/1.1/salt/)" '
{print} /NONCE_SALT/{print salt}
' "$pname/wp-config-sample.php" > tmp$$ && mv tmp$$ "$pname/wp-config-sample.php"
与 sed 不同,awk 不受反冲、引号或换行符的影响,任何其他字符都可能导致 sed 失败。
与其通过将$salt
的内容替换为文件wp-config-sample.php
并以其他方式编辑wp-config-sample.php来形成文件wp-config.php
,不如使用egrep -v
从wp-config-sample.php
中删除行,然后在末尾连接必要的新行。 也就是说,创建一个脚本来执行以下三个步骤,并用适当的代码替换write-customer-stuff
:
egrep -v 'name_here|word_here|unique phrase here' wp-config-sample.php > wp-config.php
write-customer-stuff >> wp-config.php
curl https://api.wordpress.org/secret-key/1.1/salt/ >> wp-config.php
您还可以添加如下所示的行以进行基本错误检查:
[ $(wc -l < wp-config.php) -eq $(wc -l < wp-config-sample.php) ] || echo '*** Lengths of wp-config.php and wp-config-sample.php are different ***'