일치 항목 내에서(모든 일치 항목은 아님) 텍스트를 바꾸려면 어떻게 해야 합니까?

일치 항목 내에서(모든 일치 항목은 아님) 텍스트를 바꾸려면 어떻게 해야 합니까?

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 명령의 특수 문자이므로 백슬래시를 사용하여 슬래시를 이스케이프 처리합니다.)

관련 정보