如何使用sed在第二个模式匹配中取消注释多行?

时间:2013-02-22 15:16:04

标签: sed pattern-matching lines multiple-instances

我正在尝试使用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
#

>

3 个答案:

答案 0 :(得分:3)

这可能适合你(GNU sed):

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

使用保留空间(HS)存储标志,只有在设置了标志后才对地址范围起作用。

答案 1 :(得分:1)

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

我称之为“文本转换”。它会将##location ~ \.php$ {行中的前导#}移至第 awk '/^#location ~/{s=1}s{if($0~/^#}/)s=0;sub("#"," ")}1' file 行。

awk 在线资讯:

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
#

参见示例:(文件是您的内容)

{{1}}

我希望上面的输出是你需要的。

答案 2 :(得分:0)

使用(对于此任务,这比sed更合适和更容易):

awk -F# '
    /^#location/{l++}
    l<2 {print}
    l==2{print $2}
    l==2 && $2 ~ "}" {l=0;next}
' file.txt