给定一个TCL脚本,该脚本具有以下格式的多个if条件:
if { $var1 == "string1" || $var2 == "string2" ... } {
line1
line2
line3
...
} else {
line10
line11
}
我希望找到条件中出现string1的每个if语句,删除if条件并只留下else分支中的行。在上面的示例中,预期结果将是:
line10
line11
答案 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