디렉토리에 덮어쓰기를 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
개행을 무시합니다. 즉, 전체 파일을 로드합니다. 캐럿으로 표시된 두 개는 ?
사라져야 합니다. 그리고, 그들은 "
탈출할 필요가 없다는 점에 유의하십시오 \
(그러나 해를 끼치지는 않을 것입니다).