2017-02-08 14 views
1

私はフライフィッシュキーを追加するphpMyAdmin設定ファイルにsedしようとしています。複雑な文字列で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 

...私がこれまで持っているものだが、期待どおりに動作していないです。

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

戻り

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

そして...

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

戻り

$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */ 

助けてください!

+4

'[]'文字クラスであり、SEDによってそのように解釈されています。 awkやperlを使い、正規表現の代わりに完全一致を行う方がよいでしょう。 – 123

答えて

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 

は、そのように変更されました。

EDIT:

のopensslランド-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 
+2

'sed'コマンドを単純化したい場合は、二重引用符で囲まれた単一の文字列を使うことができます。シェルが解釈するメタ文字は変数展開だけです:' sed -i -e "s/$ o/$ n/g " –

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コマンドは、ファイルのインライン編集を行いません。あなたはその後、としてgnu-awkで利用可能な-i inlineオプションを使用することを行いたい場合は、次の

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 
+0

インラインでのみご利用いただけますgawk 4.0+ – 123

+0

はい – anubhava

関連する問題