Linux
如何在與sed匹配的多行程式碼之前插入程式碼?
我想添加此程式碼
$cfg['Servers'][$i]['hide_db'] = '^(mysql|information_schema|performance_schema|phpmyadmin)$';
在行前進入 phpMyAdmin 的config.inc.php文件
/** * End of servers configuration
預期結果:
$cfg['Servers'][$i]['hide_db'] = '^(mysql|information_schema|performance_schema|phpmyadmin)$'; /** * End of servers configuration */
這是config.inc.php文件的範例(https://github.com/phpmyadmin/phpmyadmin/blob/master/config.sample.inc.php)
我目前
sed
在**.sh**文件中的程式碼是#!/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
您可以在 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 */
沒有
/\/\*/
雙星號 -簡單地製作第一個表達式和第二個表達式可能會更安全/End of servers config/
我必須使用 perl bash。
參考自
- https://stackoverflow.com/a/1252020/128761
- https://superuser.com/questions/416419/perl-for-matching-with-regular-expressions-in-terminal
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