如何使用sed在第二个模式匹配上取消注释多行?
我正在尝试使用sed来取消对此配置文件中的文本块的注释。 我的代码取消注释了7行,从第一个匹配开始,包括第一个匹配的模式匹配,但我需要它只在第二个匹配上工作,而跳过第一个匹配如何使用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 '/#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