我有一些文件包含如下所示的块:
public return_type var_name {get; set;}
public return_type var2_name {
get { if (some_condition) {some_code} else {some_code}} set; }
public return_type var3_name {
get {
if (some_condition)
{
some_code
}
else {
some_code
}
}
}
所以sed命令应该注释整个块var2_name或var3_name。它应该搜索变量并注释该变量的块。
必需输出:
public return_type var_name {get; set;}
// public return_type var2_name {
// get { if (some_condition) {some_code} else {some_code}} set; }
//public return_type var3_name {
// get {
// if (some_condition)
// {
// some_code
// }
// else {
// some_code
// }
// }
//}
答案 0 :(得分:0)
Awk
解决方案(假设多行功能定义内部没有空行):
awk '/\<var[23]_name\>/{ f=1 }f && NF{ $0="//"$0 }!NF{ f=0 }1' file
输出:
public return_type var_name {get; set;}
//public return_type var2_name {
// get { if (some_condition) {some_code} else {some_code}} set; }
//public return_type var3_name {
// get {
// if (some_condition)
// {
// some_code
// }
// else {
// some_code
// }
// }
//}
答案 1 :(得分:0)
这个问题的问题是正则表达式不可能匹配相应的括号。所以你需要自己跟踪计数。
在以下解决方案中,我做出以下假设:
然后以下awk会做到这一点:
awk 'function count_braces(str) { return gsub(/{/,"",str) - gsub(/}/,"",str) }
BEGIN{count=-1}
/var2_name|var3_name/{ count=count_braces($0);
print "//",$0; next }
(count > 0) { print "//",$0;
count=count+count_braces($0);
next }
{print $0}' <file>
并给出输出:
public return_type var_name {get; set;}
// public return_type var2_name {
// get { if (some_condition) {some_code} else {some_code}} set; }
// public return_type var3_name {
// get {
// if (some_condition)
// {
// some_code
// }
// else {
// some_code
// }
// }
// }
请注意,在此解决方案中,var2_name
或var3_name
不应出现在任何其他上下文中。拥有像/^[[:blank:]]*public return type (var2_name|var3_name)/
这样的改进正则表达式可能会更好。