여러 줄의 코드를 일치시키기 전에 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
 */

아니요이중 별표 - /\/\*/단순히 첫 번째 표현식과 두 번째 표현식을 만드는 것이 더 안전할 수 있습니다./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

관련 정보