使用Bash Sed替换包含特殊字符的字符串

3

我正在尝试在文件wp-config.php中查找{AUTH-KEYS-SALTS}并将其替换为bash变量keysalts的内容。

keysalts=`curl -sS https://api.wordpress.org/secret-key/1.1/salt/`
sed -i "s/{AUTH-KEYS-SALTS}/$keysalts/g" wp-config.php

以下代码几乎可以正常工作,但是keysalts中包含一堆特殊字符,例如$`;'",sed会感到困惑。基本上,我该如何转义所有内容并仅将{AUTH-KEYS-SALTS}替换为$keysalts?
谢谢。

如果使用bash,就不需要使用sed进行字符串替换。只需使用:(contents="$(cat wp-config.php)"; result="${contents//'{AUTH-KEYS-SALTS}'/"$keysalts"}"; echo "$result" >wp-config.php;) - Dennis Estenson
4个回答

3

另一种方法是使用perl

perl -i -pe '
  BEGIN { 
    $keysalts = qx(curl -sS https://api.wordpress.org/secret-key/1.1/salt) 
  } 
  s/{AUTH-KEYS-SALTS}/$keysalts/g
' wp-config.php

这个程序的输出只是输出到标准输出,我该如何将perl的输出写入到文件wp-config.php中? - Justin
@Justin:使用 -i 开关。已更新答案。 - Birei
@Birei 这个答案如何修改才能适用于标准的 wp-config-sample.php,而不仅仅是替换 {AUTH-KEYS-SALTS}。需要在每个定义上使用某种 foreach 循环吗? - Brandon
@Brandon:我不明白。你应该创建一个新的问题,似乎与这个问题不同。 - Birei
@Birei 这是我的问题 http://stackoverflow.com/questions/21417651/perl-salt-generation-on-wp-config-sample-php - Brandon

2
您可以使用sed本身来转义$keysalts
sed -i "s/{AUTH-KEYS-SALTS}/`echo $keysalts | sed -e 's/[\/&]/\\&/g'`/g" wp-config.php

查看这个问题获取更多信息。


echo 命令中,某些字符仍可能会引起问题(例如 ?*、多个空格等)。使用 echo "$keysalts" 或更好的选择是 printf "%s" "$keysalts",以避免这些问题。 - Gordon Davisson

1

事实证明,你问错了问题。我也问错了问题。它的错误在于第一句话的开头:“在我的bash脚本中...”。

我曾经有同样的问题并犯了同样的错误。如果你正在使用bash,你不需要使用sed来进行字符串替换(而且使用bash内置的替换功能更加清晰)。

代替:

  keysalts=`curl -sS https://api.wordpress.org/secret-key/1.1/salt/`
  sed -i "s/{AUTH-KEYS-SALTS}/$keysalts/g" wp-config.php

你可以专门使用Bash功能,将文件读入变量中,替换变量中的文本,并将替换后的文本写回文件中:

  INPUT=$(<wp-config.php)
  keysalts="$(curl -sS https://api.wordpress.org/secret-key/1.1/salt/)"
  echo "${INPUT//'{AUTH-KEYS-SALTS}'/"$keysalts"}" >wp-config.php

1

其实,我更喜欢这个one better

sed -i 's/{AUTH-KEYS-SALTS}/'"$keysalts"'/g' wp-config.php

个人选择。 :-)


不要认为这个可以工作,仍然会出现“sed:-e表达式#1,char 39:未终止的`s'命令”的错误。 - Justin
抱歉,应该使用双引号 " 而不是单引号 ' 来包围表达式。 - macduff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接