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

如何使用sed在第二个模式匹配上取消注释多行?,sed,pattern-matching,lines,multiple-instances,awk,Sed,Pattern Matching,Lines,Multiple Instances,Awk,我正在尝试使用sed来取消对此配置文件中的文本块的注释。 我的代码取消注释了7行,从第一个匹配开始,包括第一个匹配的模式匹配,但我需要它只在第二个匹配上工作,而跳过第一个匹配 sed '/#location.~.*$/,+6s/#/ /' default.conf >带有(对于此任务,这比sed更合适、更简单): awk-F#' /^#位置/{l++} 我想说,使用shell脚本更改代码是有风险的。许多特殊情况可能会使它失败 我会称之为“文本转换”。它将从

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

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

>

带有(对于此任务,这比
sed
更合适、更简单):

awk-F#'
/^#位置/{l++}

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

我会称之为“文本转换”。它将从
#location ~\.php${
行中删除前面的
#
行到第一个
}

awk在线:

 awk '/^#location ~/{s=1}s{if($0~/^#}/)s=0;sub("#"," ")}1' file
参见示例:(文件是您的内容)

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

这可能适合您(GNU-sed):


使用保留空间(HS)存储标志,并且仅在标志已设置的情况下对地址范围进行操作。

非常感谢,但我需要忽略第一个匹配,我没有任何与awk打交道和修改它的经验。Hanks mate,我无法按原样工作,我一定做错了什么。不过我很感谢你的帮助。这真是神奇!谢谢你教我更多关于sed的知识:)
awk -F# '
    /^#location/{l++}
    l<2 {print}
    l==2{print $2}
    l==2 && $2 ~ "}" {l=0;next}
' file.txt
 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
#
sed 'x;/./{x;/#location/,+6s/#/ /;b};x;/#location/h' file