AllowOverride None
경로가 있는 그룹에서 교체하고 싶습니다 /var/www/
. 이 작업을 위해 sed를 사용하고 있지만 모든 일치 항목을 대체합니다.
Apache2.conf스크립트를 실행하기 전에
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Apache2.conf스크립트를 실행한 후
<Directory />
Options FollowSymLinks
AllowOverride All
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride All
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
스크립트 파일
#!/bin/bash
sed "s/AllowOverride None/AllowOverride All/g" apache2.conf
내 질문은 다음과 같습니다sed에게 교체하라고 어떻게 말하나요 /var/www/
?
답변1
이를 달성하려면 다음 Perl oneliner를 사용할 수 있습니다.
perl -0777 -pe 's{(<Directory\s/var/www/.*?AllowOverride\s)None(.*?</Directory>)}{$1All$2}gs' /tmp/file
이 -0777
플래그는 줄 구분 기호를 undef로 변경하므로 perl은 파일을 한 줄로 읽습니다(대용량 파일에서는 문제가 될 수 있습니다).
-p
파일 라인을 반복하고 인쇄하고
-e
스크립트,
/tmp/file
구성 파일을 실행하십시오.
s{(<Directory\s/var/www/.*?AllowOverride\s)None(.*?</Directory>)}{$1All$2}gs
/var/www의 두 부분으로 구성된 디렉토리 섹션과 일치하고 기본적으로 None을 All로 바꾸는 정규식입니다. Perl에서는 거의 모든 기호를 정규식 구분 기호로 사용할 수 있습니다. 이 경우 {}
에는 //
.
답변2
한 가지 방법 sed
은 다음과 같습니다.
sed -E '/<Directory \/var\/www\/>/,/<\/Directory>/{
s/AllowOverride None/AllowOverride All/; }' infile
업데이트/변경되었습니다AllowOverride None
도착하다AllowOverride All
사이에 있는 경우에만<Directory /var/www/>
&</Directory>
(슬래시는 sed 명령의 특수 문자이므로 백슬래시를 사용하여 슬래시를 이스케이프 처리합니다.)