sed复杂的字符串

时间:2017-02-08 15:07:34

标签: bash sed

我尝试使用phpMyAdmin配置文件添加一条河豚键。

这是我到目前为止所拥有的......

int ascii = 10003;

我没有收到任何错误,但是没有按预期工作。

k=$(openssl rand -base64 32)
o="\$cfg['blowfish_secret'] = '';"
n="\$cfg['blowfish_secret'] = '$k';" 
sed -i -e 's/'"$o"'/'"$n"'/g' /var/www/phpmyadmin/config.inc.php

返回

echo -e "$k\n$o\n$n"

和...

Jgcv3FlugcVi5rDYLCdNhxX6sEZatt0zTZV3PISiLJY=
$cfg['blowfish_secret'] = '';
$cfg['blowfish_secret'] = 'Jgcv3FlugcVi5rDYLCdNhxX6sEZatt0zTZV3PISiLJY=';

返回

cat /var/www/phpmyadmin/config.inc.php | grep blowfish

请帮忙!

2 个答案:

答案 0 :(得分:1)

注释[]中提到的AS 123被sed解释为字符类,只需用反斜杠转义它就解决了我的问题。

所以这个:

k=$(openssl rand -base64 32)
o="\$cfg['blowfish_secret'] = '';"
n="\$cfg['blowfish_secret'] = '$k';" 
sed -i -e 's/'"$o"'/'"$n"'/g' /var/www/phpmyadmin/config.inc.php

改为:

k=$(openssl rand -base64 32)
o="\$cfg\['blowfish_secret'\] = '';"
n="\$cfg\['blowfish_secret'\] = '$k';" 
sed -i -e 's/'"$o"'/'"$n"'/g' /var/www/phpmyadmin/config.inc.php

现在它有效。

编辑:

由于 openssl rand -base64 32 可以生成带有斜杠的字符串,因此最好立即将其转义。另外,我毕竟选择使用perl。这是更正后的代码:

k=$(openssl rand -base64 32 | sed 's,\/,\\/,g')
o="\$cfg\['blowfish_secret'\] = '';"
n="\$cfg\['blowfish_secret'\] = '$k';"
sudo perl -p -i -e "s/$o/$n/g" /var/www/phpmyadmin/config.inc.php

答案 1 :(得分:0)

如果你想在搜索和替换字符串中使用所有类型的特殊正则表达式元字符,这是使用awk执行该操作的非正则表达方式:

# utility function to format search and replace strings
frmt() {
   printf "\$cfg['blowfish_secret'] = '%s';" "$1"
}

# awk command to perform search and replace using plain text search
awk -v s="$(frmt "")" -v r="$(frmt "$k")" 'n=index($0, s) {
   print r substr($0, n+length(s))
}' /var/www/phpmyadmin/config.inc.php

PS:请注意,上面的awk命令不会对文件进行内联编辑。如果您想这样做,请使用-i inline提供的gnu-awk选项作为:

awk -i inline -v s="$(frmt "")" -v r="$(frmt "$k")" 'n=index($0, s) {
   print r substr($0, n+length(s))
}' /var/www/phpmyadmin/config.inc.php