4

我正在尝试使用 sed 取消注释此配置文件中的一段文本。我提出的代码取消注释从第一个匹配开始并包括模式匹配的 7 行,但我需要它只在第二个匹配上工作并跳过第一个匹配。

                 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

我想说,使用 shell 脚本来更改代码是有风险的。许多特殊情况可能使其失败。

我将其称为“文本转换”。它将删除##location ~ \.php$ {行到第一#}行的前导。

awk在线:

 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 回答