我正在尝试使用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
#
>
答案 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)
使用awk(对于此任务,这比sed
更合适和更容易):
awk -F# '
/^#location/{l++}
l<2 {print}
l==2{print $2}
l==2 && $2 ~ "}" {l=0;next}
' file.txt