2016-08-09 34 views
1

zu interpretieren Ich bin fest auf einen Ausdruck sed Ausdruck, der eine Python-Datei importieren analysiert und extrahiert die Namen der Module.Verwenden Sie sed, um mehrere Zeilen unter der Bedingung

Dies ist ein einfaches Beispiel, das ich unter Verwendung gelöst (Ich brauche die Ausgabe die Modulnamen zu sein, ohne ‚als‘ oder irgendwelche Räume ..):

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

Was ich habe, so weit:

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

Dies bringt mir das erforderliche Ergebnis in einer Situation wie oben.

Das Problem: In Dateien, in denen die Importe sind wie folgt:

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

Irgendwelche Ideen, wie ich meine verrohrt Ausdruck über mehrere Zeilen zu handhaben verbessern?

+1

must du 'sed' benutzen? 'awk 'wird einfacher sein (und warum nicht Python?) Viel Glück. – shellter

+0

Sed ist ein Zeileneditor, es liest einzelne Zeilen, Sie können 'N' oder' n' verwenden, um die nächste Zeile zu erhalten. Auch wirst du nur eine einzige Zeile von deinem Grep zurückgeben. – 123

+0

@Shellter Ich denke eigentlich, das ist einfacher in sed. Sie erhalten nur die nächste Zeile, bis keine weiteren Escape-Zeichen und dann ein einfaches Sub. – 123

Antwort

1

Versuchen Sie dies;

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

Danke für die Antwort! Ich habe stattdessen eine Python-Lösung verwendet – bardavid

1

Vielen Dank für Ihre Hilfe. Ich wusste nicht, dass ein Modul wie ast existiert. Es hat mir wirklich geholfen, mein Ziel zu erreichen.

Ich habe eine einfache Version der Lösung, die ich brauchte, nur als Referenz, wenn jemand anderes auch diese Frage begegnet:

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]) 

Sie können mehr über sie in (wahrscheinlich die einzigen detaillierten Seite lesen über ast im ganzen Web) hier: https://greentreesnakes.readthedocs.io/en/latest/manipulating.html#inspecting-nodes

Verwandte Themen