Linux

如何在與sed匹配的多行程式碼之前插入程式碼?

  • August 16, 2021

我想添加此程式碼

$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。

參考自

  1. https://stackoverflow.com/a/1252020/128761
  2. 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

引用自:https://unix.stackexchange.com/questions/664764