如何使用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代码在.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

答案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
 */

没有双星号 -/\/\*/简单地制作第一个表达式和第二个表达式可能会更安全/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

相关内容