从文件夹中的多个文件中提取相似的行

时间:2019-01-28 09:45:00

标签: python regex text awk sed

我有一个目录,其中包含约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

5 个答案:

答案 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"