내부의 여러 줄 문자열 교체 태그

내부의 여러 줄 문자열 교체 태그

디렉토리에 덮어쓰기를 httpd.conf허용하도록 파일을 수정하려고 합니다 . /var/www/html단순화를 위해 다음과 같다고 가정해 보겠습니다.

<Directory "/var/www/html">
    # Comment
    AllowOverride none
    # Comment
</Directory>

AllowOverride none으로 교체해 보세요 AllowOverride All.

나는 다음과 같은 것을 시도했습니다 :

sed -i 's/\(Directory \"\/var\/www\/html\">.*?\)AllowOverride none\(.*?<\/Directory>\)/\1AllowOverride all\2/' httpd.conf

여러 줄을 캡처하는 것 같지 않았기 때문에 정규식 수정자와 같은 몇 가지 다른 작업을 시도했습니다.https://www.gnu.org/software/sed/manual/html_node/Text-search-across-multiple-lines.html 그러나 필수 문자열이 일치할 수 없습니다.

이 일을 어떻게 하시겠습니까? sed 이외의 솔루션도 환영합니다.

답변1

나는 당신이 원하는 것은 다른 곳이 아닌 AllowOverride none해당 블록 내의 특정 콘텐츠를 바꾸는 것이라고 가정합니다 . <Directory "/var/www/html">우리는 할 수있어.

간결한 버전:

sed -i '/^<Directory "\/var\/www\/html">/,/^<\/Directory>/ {
    s/AllowOverride none/AllowOverride all/;
}' httpd.conf

이는 대체 명령이 지정된 행 사이에만 적용됨을 의미합니다.

먼저 파일을 백업한 다음 diff다시 백업하여 필요한 파일이 있는지 확인하세요. :)

답변2

sed라인 기반의 *nix 텍스트 도구입니다. 여러 행에 대해 작업하려면 특정 조치를 취해야 합니다. 왜 안 돼

sed 's/AllowOverride none/AllowOverride all/' file

귀하의 요구 사항을 충족합니까?

편집하다:또는 "목차" 단락의 문자열만 변경하려는 경우,

sed '/<Directory "\/var\/www\/html">/,/<\/Directory>/ s/AllowOverride none/AllowOverride all/' file

편집하다:세 가지 작은 조정을 통해 스크립트가 제대로 작동하도록 할 수 있습니다.

sed    's/\(Directory \"\/var\/www\/html\">.*?\)AllowOverride none\(.*?<\/Directory>\)/\1AllowOverride all\2/' file
sed -z 's/\(Directory \"\/var\/www\/html\">.*\)AllowOverride none\(.*<\/Directory>\)/\1AllowOverride all\2/' file
     ^                                       ^                        ^ 

-z(--null-data, NUL 문자로 행을 구분합니다. 참조 man sed) sed개행을 무시합니다. 즉, 전체 파일을 로드합니다. 캐럿으로 표시된 두 개는 ?사라져야 합니다. 그리고, 그들은 "탈출할 필요가 없다는 점에 유의하십시오 \(그러나 해를 끼치지는 않을 것입니다).

관련 정보