在模式匹配后,Sed / Awk会删除2个标记之间的整个部分

时间:2017-11-03 14:15:03

标签: awk sed

给定一个TCL脚本,该脚本具有以下格式的多个if条件:

if { $var1 == "string1" || $var2 == "string2" ... } {
   line1
   line2
   line3
   ...
} else {
   line10
   line11
}

我希望找到条件中出现string1的每个if语句,删除if条件并只留下else分支中的行。在上面的示例中,预期结果将是:

line10
line11

1 个答案:

答案 0 :(得分:1)

你最好使用一个真正的TCL解析器,但这里有一个awk脚本(基本上是一个简单的状态机)来处理你提出的简单案例:

awk '/if.*string1/ {inif=1;next}
     inif && /\}\s*else\s*\{/ {inif=0;inelse=1;next}
     inelse && /\}/ {inelse=0;next}
     inelse {sub(/\s*/,"")}
     !inif' file

示例输入(来自问题的扩展样本):

$ cat file
if { $var1 == "string1" || $var2 == "string2" ... } {
   line1
   line2
   line3
   ...
} else {
   line10
   line11
}

if { $var1 == "string1" || $var2 == "string2" ... } {
   line1
   line2=2
   line3="2";
   ...
} else {
   line11
   line12
}

if { something else } {
    test
}

if { $var1 == "string1" || $var2 == "string2" ... } {
   line1
   line2
   line3
   ...
} else {
   line13="3";
   line11
}

结果:

$ awk '/if.*string1/ {inif=1;next}  inif && /\}\s*else\s*\{/ {inif=0;inelse=1;next}  inelse && /\}/ {inelse=0;next}  inelse {sub(/\s*/,"")}  !inif' file
line10
line11

line11
line12

if { something else } {
    test
}

line13="3";
line11
相关问题