단 하나의 [중복] 대신 2개 이상의 라인(이 경우 모든 라인)으로 sed가 작동하도록 만드세요.

단 하나의 [중복] 대신 2개 이상의 라인(이 경우 모든 라인)으로 sed가 작동하도록 만드세요.

저는 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.

-ll명령에만 해당됩니다 .

sed일찍 종료하는 등 하지 말라고 지시하지 않는 한 모든 라인을 처리합니다. 명령 g의 옵션은 s여러 번 나타나는 검색어를 처리하는 방법에만 영향을 미칩니다.각 라인: 그렇지 않은 경우 g주어진 줄의 첫 번째 항목만 대체되는 반면, 을 사용하면 g모든 항목이 대체됩니다. 두 경우 모두 교체가 모든 행에 적용됩니다.

관련 정보