我试图将表达式与特定模式匹配的 C++ 代码库中的任何“if”块复制到文本文件中。这是否可以使用 grep/awk/sed 等的某种组合?
如果我有包含以下代码的文件:
//File1.cpp
if(/*matching-expression-1*/)
{
//Code
}
//File2.cpp
if(/*non-matching-expression*/)
{
if(/*matching-expression-2*/)
{
//Code
}
}
//File3.cpp
if((/*matching-expression-3*/)
{
if(/*non-matching-expression*/)
{
//Code
}
}
我想得到如下结果:
//OutputFile.txt
File1.cpp:
if(/*matching-expression-1*/)
{
//Code
}
File2.cpp:
if(/*matching-expression-2*/)
{
//Code
}
File3.cpp:
if((/*matching-expression-3*/)
{
if(/*non-matching-expression*/)
{
//Code
}
}
我对//Code
包含其他匹配/不匹配if
块的块没问题,即使这会导致重复条目,并且不需要保留制表符缩进。
我使用 grep 匹配我想要的表达式没有问题,但这只会给我包含“if”块开头的行(这是一个好的开始!)但我不确定如何继续。
任何帮助都将不胜感激!
在 awk 中:
$ awk '/\*matching-expression/{f=1}f{c+=sub(/{/,"{");if(sub(/}/,"}") && --c==0)f=0;print $0}' file
if(/*matching-expression-1*/)
{
//Code
}
if(/*matching-expression-2*/)
{
//Code
}
if((/*matching-expression-3*/)
{
if(/*non-matching-expression*/)
{
//Code
}
}
解释:
/\*matching-expression/ { f=1 } # flag up at match
f { # when flag is up
c+=sub(/{/,"{") # { increments counter
if(sub(/}/,"}") && --c==0) # if count is about be 0
f=0 # flag down
print $0 # print when flag is up
}
它希望每个{
和}
都在自己的路线上。好吧,那条线上可以有其他东西,但只有一个{
或}
. 哦,是的,@123 的无杂散括号也适用于此,我认为这需要解析括号周围的引号。可能仍然可行,我认为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句