{}
如果在块内找到模式,我想删除花括号块+它的“名称”(2个单词前缀)。
我尝试了一些sed
魔法,但没能成功。
例如:
- 图案:图案 图案-X
输入
m m1 {
s s1;
s s2;
c c1 {
s s3;
c c2 {
PATTERN PATTERN-X
...
}
s s4;
}
c c3 {
PATTERN PATTERN-X
...
c c4 {
s s4;
}
}
}
输出
m m1 {
s s1;
s s2;
c c1 {
s s3;
s s4;
}
}
答案1
你可以试试这个 awk
awk '
$0~/{/{
if(b) {
print b
b=""
}
if(c)
c++
}
$0~/PATTERN/ {
b=""
c=2
}
$0~/}/ {
if(c)
c--
}
!c {
if(b)
b=b RS
b=b $0
}
END {
print b
}
' infile
答案2
通常解析任何函数式语言都不是一个好主意,这个例子看起来就是这样。解析工具旨在处理正则表达式工作正常的人类语言。话虽这么说……我们仍然可以尝试。
这是我使用的方法pcregrep
:
pcregrep -Mv '.*{.*\n.*PATTERN(([^{}]|\n)*|([^{}]|\n)*{([^{}]|\n)*}.*([^{}]|\n)*)}.*' file
与您的示例配合良好,即{}
后的零或一个块深度PATTERN
。如果您有多个块,只需扩展它以满足您的需求。
输出:
m m1 {
s s1;
s s2;
c c1 {
s s3;
}
}