4

sedを使用して、この構成ファイルのテキストのブロックのコメントを解除しようとしています。私が思いついたコードは、最初の一致のパターン一致から始まり、最初の一致のパターン一致を含む7行のコメントを外しますが、2番目の一致でのみ機能し、最初の一致をスキップするために必要です。

                 sed '/#location.~.*$/,+6s/#/ /' default.conf

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {                
#    root           html;
#    fastcgi_pass   127.0.0.1:9000;
#    fastcgi_index  index.php;
#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
#    include        fastcgi_params;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#

>>

4

3 に答える 3

3

これはあなたのために働くかもしれません(GNU sed):

sed 'x;/./{x;/#location/,+6s/#/ /;b};x;/#location/h' file

ホールドスペース(HS)を使用してフラグを格納し、フラグが設定されている場合にのみアドレス範囲に作用します。

于 2013-02-22T22:35:33.480 に答える
1

シェルスクリプトを使用してコードを変更するのは危険です。多くの特殊なケースでは失敗する可能性があります。

代わりに「テキスト変換」と呼びます。#行から#location ~ \.php$ {最初の行への先頭を削除し#}ます。

awk onliner:

 awk '/^#location ~/{s=1}s{if($0~/^#}/)s=0;sub("#"," ")}1' file

例を参照してください:(ファイルはあなたのコンテンツです)

kent$  awk '/^#location ~/{s=1}s{if($0~/^#}/)s=0;sub("#"," ")}1' file
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
 location ~ \.php$ {
     proxy_pass   http://127.0.0.1;
 }

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
 location ~ \.php$ {                
     root           html;
     fastcgi_pass   127.0.0.1:9000;
     fastcgi_index  index.php;
     fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
     include        fastcgi_params;
 }
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#

上記の出力が必要なものであることを願っています。

于 2013-02-22T15:29:17.473 に答える
0

を使用する場合(これはsed、このタスクよりも適切で簡単です):

awk -F# '
    /^#location/{l++}
    l<2 {print}
    l==2{print $2}
    l==2 && $2 ~ "}" {l=0;next}
' file.txt
于 2013-02-22T15:24:35.870 に答える