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

模式匹配后,Sed/Awk删除2个标记之间的整个部分,awk,sed,Awk,Sed,给定具有以下格式的多个if条件的TCL脚本: if { $var1 == "string1" || $var2 == "string2" ... } { line1 line2 line3 ... } else { line10 line11 } 我希望找到条件中string1出现的每个if语句,删除if条件,只在else分支中保留行。在上述示例中,预期结果为: line10 line11 使用真正的TCL解析器可能会更好,但这里有一个awk脚本(基本上是

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

if { $var1 == "string1" || $var2 == "string2" ... } {
   line1
   line2
   line3
   ...
} else {
   line10
   line11
}
我希望找到条件中string1出现的每个if语句,删除if条件,只在else分支中保留行。在上述示例中,预期结果为:

line10
line11

使用真正的TCL解析器可能会更好,但这里有一个
awk
脚本(基本上是一个简单的状态机)可以处理您介绍的简单情况:

awk '/if.*string1/ {inif=1;next}
     inif && /\}\s*else\s*\{/ {inif=0;inelse=1;next}
     inif && /\}/ {inif=0;next}
     inelse && /\}/ {inelse=0;next}
     inelse {sub(/\s*/,"")}
     !inif' file
示例输入(问题的扩展示例):

结果:

$ 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
}

每个if语句您的代码只有一个这样的
if
stm在上面的示例中,我只包含了一个,但是该文件可以有多个,如果类似于string1用于条件检查的情况,那么嵌套的
if
s呢?如果嵌套的
if
s的
string1
处于状态,则假定不存在嵌套的if,也不会有嵌套的if。所有的条件都与上面的非常相似。那么
linex
看起来像什么?复杂的命令,还是?我没办法。我使用的正是您的文件作为测试,在tcsh(主要是我需要在cshell中工作)上,我得到:
Unmatched.
如果我在#中创建脚本/bin/sh,我得到:
awk:warning:escape sequence
\}被当作普通
}'awk:warning:escape sequence
\s'被当作普通
s'awk:warning:escape sequence
\{'被当作普通
{'
bashshell在使用-F选项运行时出现的上述错误。如果我删除开关,则根本没有输出。似乎什么都没有做。不确定
awk
3,但您可以尝试像使用hash bang
.!/usr/bin/awk-F
和下一行的程序
/If.*string1/{inif=1;下一个}在if&&…
。此外,您可以尝试使用
gawk
,甚至可能安装最新版本的
gawk
。不用担心,我已经在这段时间内解决了它。我对您的脚本进行了反向工程,并对其进行了轻微修改,现在可以在两个版本上使用。还意识到,在某些情况下,我希望保留if分支而不是else部分ed。现在一切都好了。谢谢你!谢谢@MichaelShigorin,让我回到这个答案。检查时,我注意到一个案例处理不当(如果没有其他案例,则匹配),所以我修复了它。谢谢!
$ 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
}