저는 Bash와 함께 Ubuntu 16.04를 사용하고 있으며 Nginx 환경의 특정 웹 사이트에 대해 http2를 활성화해야 합니다.
기본적으로 유틸리티는 sed
첫 번째 관련 줄의 첫 번째 인스턴스에서 텍스트 처리를 수행하지만( g
매개변수를 사용하면 첫 번째 관련 줄의 모든 인스턴스를 처리하게 됩니다)2줄 이상(실제로는 모든 행)
살펴보고 사용할 행 수를 지정할 수 있는 매개 변수를 man sed
찾았지만 -l
(올바르게 이해한 경우) 특정 행 수에 의존하지 않고 모든 행에 대해 작업하고 싶습니다.
sed
내가 겪고 있는 특별한 경우는 이 두 작업을 하나로 통합 하려고 한다는 것입니다 .
s_a="/etc/nginx/sites-available/"
$domain="example.com"
sed -i "s/listen 443 ssl default_server;/listen 443 ssl http2 default_server;/" $s_a/$domain.conf
sed -i "s/listen [::]:443 ssl default_server;/listen [::]:443 ssl http2 default_server;/" $s_a/$domain.conf
sed
이 두 가지 작업을 다음과 같이 통합 할 수 있습니다 .
sed -i "s/443 ssl default_server/443 ssl http2 default_server/" $s_a/$domain.conf
모든 관련 행이 이렇게 편리한 한 줄 작업으로 처리되도록 하는 가장 안전한 방법은 일부 매개 변수를 사용하는 것입니다. 하지만 매개 변수를 통해 이 작업을 수행할 수 있는지( -l
있는 경우) 또는 매개 변수를 통해 수행해야 하는지는 알 수 없습니다. 정규 표현식을 사용하세요.
답변1
다음과 같은 이유로 여기에 버그가 있는 것 같습니다.
sed -i "s/443 ssl default_server/443 ssl http2 default_server/" $s_a/$domain.conf
정상적으로 작동합니다. "443 ssl http2 default_server" 로 대체됩니다 $s_a/$domain.conf
.
-l
l
명령에만 해당됩니다 .
sed
일찍 종료하는 등 하지 말라고 지시하지 않는 한 모든 라인을 처리합니다. 명령 g
의 옵션은 s
여러 번 나타나는 검색어를 처리하는 방법에만 영향을 미칩니다.각 라인: 그렇지 않은 경우 g
주어진 줄의 첫 번째 항목만 대체되는 반면, 을 사용하면 g
모든 항목이 대체됩니다. 두 경우 모두 교체가 모든 행에 적용됩니다.