使用sed解释条件

时间:2016-08-09 12:39:31

标签: python regex bash sed grep

我坚持构建 sed 表达式,该表达式将解析python文件的导入并提取模块的名称。

这是我使用的一个简单示例(我需要输出为模块名称,而不是' as'或者任何空格......):

from testfunctions import mod1, mod2 as blala, mod3, mod4

到目前为止我所拥有的:

grep -ir "from testfunctions import" */*.py | sed -E s/'\s+as\s+\w+'//g | sed -E s/'from testfunctions import\s+'//g

这确实在上述情况下得到了所需的结果。

问题: 在导入类似的文件中:

from testfunctions import mod1, mod2 as blala, mod3, mod4 \
     mod5, mod6 as bla, mod7 \
   mod8, mod9 ...

我有什么想法可以改善我的管道表达式以处理多行?

2 个答案:

答案 0 :(得分:1)

试试这个;

   sed -n -r '/from/,/^\s*$/p;' *.py | sed ':x; /\\$/ { N; s/\\\n//; tx }'  | sed 's/^.*.import//g;s/  */ /g'

答案 1 :(得分:1)

感谢大家的帮助。我不知道ast这样的模块存在。它确实帮助我实现了目标。

我整理了一个我需要的解决方案的简单版本,仅供参考,如果其他人也遇到这个问题:

import glob
import ast

moduleList = []
# get all .py file names
testFiles = glob.glob('*/*.py')
for testFile in testFiles:
    with open(testFile) as code:
        # ast.parse creates the tree off of plain code
        tree = ast.parse(code.read())
        # there are better ways to traverse the tree, in this sample there
        # is no guarantee to the traversal order
        for node in ast.walk(tree):
            if isinstance(node, ast.ImportFrom) and node.module == 'testfunctions':
                # each node will contain an ast.ImportFrom instance which
                # data members are: module, names(list of ast.alias) and level
                moduleList.extend([alias.name for alias in node.names])

您可以在此处详细了解相关信息(可能是整个网络中ast的唯一详细信息页面):https://greentreesnakes.readthedocs.io/en/latest/manipulating.html#inspecting-nodes