2016-08-09 4 views
1

Я застрял в построении выражения sed, которое будет анализировать импорт файла python и извлекать имена модулей.Использование sed для интерпретации нескольких строк при условии

Это простой пример, который я решил с помощью (мне нужен выход, чтобы быть имена модулей без «как» или любых пространств ..):

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 ... 

Любые идеи, как я могу улучшить свою трубопроводную выражение для обработки нескольких строк?

+1

вам нужно использовать 'sed'? 'awk' будет проще (и почему бы не python?) Удачи. – shellter

+0

Sed - редактор строк, он читает одиночные строки, вы можете использовать 'N' или' n' для получения следующей строки. Также вы все равно вернете только одну строку из вашего grep. – 123

+0

@shellter Я на самом деле думаю, что это проще в sed. Вы просто получите следующую строку, чтобы больше не ускользнуть, а затем сделать простой суб. – 123

ответ

1

Попробуйте это;

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

Спасибо за ответ! Вместо этого я использовал решение python – bardavid

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

Смежные вопросы