複数行のコードを一致させる前にsedを使用してコードを挿入する方法は?

複数行のコードを一致させる前にsedを使用してコードを挿入する方法は?

このコードを追加したい

$cfg['Servers'][$i]['hide_db'] = '^(mysql|information_schema|performance_schema|phpmyadmin)$';

phpMyAdminと入力してください設定ファイル.inc.php文書今後ワイヤー

/**
 * End of servers configuration
予想される結果:
$cfg['Servers'][$i]['hide_db'] = '^(mysql|information_schema|performance_schema|phpmyadmin)$';

/**
 * End of servers configuration
 */

これはサンプルです設定ファイル.inc.php文書(https://github.com/phpmyadmin/phpmyadmin/blob/master/config.sample.inc.php)

私の現在のsedコードはファイルは

#!/bin/sh

PHPMATARGETDIR="/var/www/phpmyadmin"

sudo sed -i "s/\(\/\*\*\)/ #my code before;\n\1/" ${PHPMATARGETDIR}/config.inc.php

しかし、うまくいきません。開いているすべてのコメントブロックの前にのみ追加されます。

このコードを使用すると、まったく機能しません。

sudo sed -i "s/\(\/\*\*\n\s*\* End of servers configuration\)/ #my code before;\n\1/" ${PHPMATARGETDIR}/config.inc.php

答え1

sedでこれを行うことができます。

sed "/\/\*\*/{
N
/ \* End of servers config/i\
\$cfg['Servers'][\$i]['hide_db'] = '^(mysql|information_schema|performance_schema|phpmyadmin)\$';
}" config.inc.php

あなたが提供するものには、config.inc.php実際には以下が含まれています。

/*
 * End of servers configuration
 */

いいえ二重アスタリスク -/\/\*/単に最初の式と2番目の式を作成する方が安全です。/End of servers config/

答え2

私にとって、解決策はPerl bashを使用することでした。ここからそしてこの参照

PHPMATARGETDIR="/var/www/phpmyadmin"

ADDPMACONFIG="\$cfg['Servers'][\$i]['hide_db'] = '^(mysql|information_schema|performance_schema|phpmyadmin|sys)\$';"
ADDPMACONFIG=$(printf '%s\n' "$ADDPMACONFIG" | sed -e 's/[]\/$*.|()^[]/\\&/g')
sudo perl -0777 -i -p -e "s/(\/\*\*\n\s+\*\s+End of servers configuration.*)/${ADDPMACONFIG}\n\1/" ${PHPMATARGETDIR}/config.inc.php

関連情報