我有一个目录,其中包含约30个具有类似模式的Python文件,如下所示:
import stuff
class BarFoo001(BarFooBase):
info = self.info
description = 'here's the stuff I want'
IS_CRITICAL = true
def method(sdf):
etc...
我想从每个文件中仅提取出具有类名和描述的行(仅以文本为参考,我不需要有效的Python文件)。
我的第一个想法是使用Shell工具来执行此操作。我使用了cat *.py > all.py
,然后尝试进行sed -i -e 's/BarFooBase\(.*\)IS_CRITICAL/\1/' all.py
,但这似乎没有效果。我也尝试在IDE中使用RegEx,最后在Python(re.sub('IS_CRITICAL[^>]+\nclass Bar', '', my_string)
中使用RegEx,但是这些都没有给我我想要的结果。我的Regex有什么问题?另外,有没有更简单的方法可以做到这一点呢?
这将是一个足够好的输出:
BarFoo001(BarFooBase)类:
info = self.info
description ='这是我想要的东西'
IS_CRITICAL
答案 0 :(得分:2)
使用sed,您可以使用地址范围来输出行的块:
sed -n '/^[[:blank:]]*class[[:blank:]]/,/IS_CRITICAL/p' file.py
编辑:
在[[:blank:]]
之前和之后添加了class
,以仅匹配以零个或多个空格或制表符开头的类定义。
答案 1 :(得分:1)
尝试一下,看看结果是否是您想要的(GNU awk):
awk '/IS_CRITICAL/{sub(/IS_CRITICAL.*/,"IS_CRITICAL");print "class " $0}' RS="class " all.py
答案 2 :(得分:1)
能否请您尝试以下。尽管无法在所有版本或不同的O.S系统中进行测试,但它应该可以在所有awk
版本的版本中运行。
awk '
{
sub(/^ +/,"")
}
/class/{
found=1
}
/IS_CRITICAL/ && found{
sub(/ =.*/,"")
print
found=""
}
found
' Input_file
答案 3 :(得分:1)
使用Perl单线版
perl -0777 -ne ' while( /(\bclass\s*.+?IS_CRITICAL)/gs ) { print "$1\n" } '
带有输入:
$ cat josh.py
import stuff
class BarFoo001(BarFooBase):
info = self.info
description = 'here's the stuff I want'
IS_CRITICAL = true
def method(sdf):
etc...
def method2(fddf):
print
$ perl -0777 -ne ' while( /(\bclass\s*.+?IS_CRITICAL)/gs ) { print "$1\n" } ' josh.py
class BarFoo001(BarFooBase):
info = self.info
description = 'here's the stuff I want'
IS_CRITICAL
$
要搜索多个文件,可以使用
perl -0777 -ne ' while( /(\bclass\s*.+?IS_CRITICAL)/gs ) { print "$ARGV:$1\n" } ' *py
答案 4 :(得分:1)
for /r C:\path\ %a in (*.avi) do ffmpeg -i "%a" "%~pa%~na.mp4"