【问题标题】:Bash Sed Find & Replace With Special CharactersBash Sed 查找和替换特殊字符
【发布时间】:2015-12-30 07:41:08
【问题描述】:

我试图在文件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;)

标签: bash sed


【解决方案1】:

其他方式可以使用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:使用-i 开关。更新了答案。
  • @Birei 如何修改此答案以使用标准 wp-config-sample.php 而不仅仅是替换 {AUTH-KEYS-SALTS}。每个定义都有某种 foreach 循环?
  • @Brandon:我不明白。您应该针对您的问题创建一个新问题,这似乎与这个问题不同。
  • @Birei 这是我的问题*.com/questions/21417651/…
【解决方案2】:

您可以使用 sed 本身转义 $keysalts

sed -i "s/{AUTH-KEYS-SALTS}/`echo $keysalts | sed -e 's/[\/&]/\\&/g'`/g" wp-config.php

更多信息请参见this question

【讨论】:

  • echo 命令中仍有一些字符会引起问题(?*、多个空格...)。使用echo "$keysalts" 或更好的printf "%s" "$keysalts" 来避免这些问题。
【解决方案3】:

其实我喜欢这个one better

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

个人选择。 :-)

【讨论】:

  • 别以为这行得通,还是sed: -e expression #1, char 39: unterminated s'命令`
  • 对不起,' 不是 " 包围表达式。
【解决方案4】:

原来你问错了问题。我也问错了问题。错误的原因是第一句话的开头:“在我的 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

【讨论】:

    最近更新 更多