2016-12-12 11 views
0

ich einige Zeichenfolge haben, die unterErste Rückgabetyp schnellen Funktion awk mit/sed

aussehen

internal func applicationWillResignActive(_ application: UIApplication) -> <<error type>>

internal func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]?) -> Bool

internal func helloWorld()

In diesen Zeilen möchte ich die Rückkehr bekommen Typ der Funktion, die nach -> vorhanden ist, jedoch eine Funktion möglicherweise nicht Rückgabetyp (in diesem Fall ist es standardmäßig auf Void

Ich muss ein Shell-Skript schreiben, vorzugsweise mit awk oder sed, die mir Rückgabetyp erhalten können. Es sollte jedoch Void im ersten und dritten Fall zurückgeben.

Was habe ich versucht? cut -d ">" -f 2 <<< "$string" - aber das ist sehr einfach und funktioniert auch im einfachen 3. Fall, wo es die ursprüngliche Zeichenfolge als es zurückgibt.

+0

Ich bin mit schnellen Syntax nicht vertraut. kann eine Codezeile max. habe single '->'? Übrigens, gibt es ein schnelles Tool für die Code-Analyse? es wäre genauer. – Kent

+0

imho sollten Sie das Tag "swift" hinzufügen – user31264

+0

Ja, es kann maximal Single '->' haben. Ich benutze sourceKitten für den Rest der Informationen und die weitere Verarbeitung, aber sie geben keinen Rückgabetyp zurück. – prabodhprakash

Antwort

1
# -- all purpose (file with other line also like full source code) --- 
sed -e '/ func /!d' -e '/->/!s/.*//;/.*-> */{s///;s/.*<<error type>>.*//;};s/^[[:blank:]]*$/void/' YourFile 


# -- tiny adapted for string --- 
YourStream | sed '/->/!s/.*/void/;s/.*-> *//;s/.*<<error type>>.*/void/' 

Erklären

  • / func /!d entfernen Linie ohne func.
  • /->/!s/.*// leer (Inhalt löschen) Zeile ohne ->.
  • /.*-> */{...} für Linien mit -> (und der Vorbereitung für die nächste Muster s/// von Beginn der Zeile bis zum letzten Lings nach ->)
    • s/// Entfernen begining einschließlich -> (aus früheren Musterabgleich).
    • s/.*<<error type>>.*// leer (löschen Inhalt) <<error type>> Linien
  • s/^[[:blank:]]*$/void/ Satz void jede leere Zeile
+0

Alles ist in Ordnung mit einem Fall, "Echo" interne Funk HalloWelt (a: String) " sed -e '/ func /! d' -e '/[.->.]/! s /.*//;/.*-> */{s ///; s /.* <>. * //;}; s/^ [[: blank:]] * $/void/''- in diesem Fall ist die Ausgabe' internal func helloWorld (a: String) '- dies sollte auch' Void' sein – prabodhprakash

+0

Konnte Bitte helfen Sie mir dabei. – prabodhprakash

+0

Tut mir leid, ich verwende schlecht kollationierende Klasse '[.->.]', Sie müssen nur '->' verwenden, ändere ich die Antwort – NeronLeVelu

2

können Sie verwenden:

awk -F"-> *" 'NF>0{print(NF==1?"Void":$NF=="<<error type>>"?"Void":$NF)}' file 

es Live-See:

$ cat file 
internal func applicationWillResignActive(_ application: UIApplication) -> <<error type>> 

internal func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]?) -> Bool 

internal func helloWorld() 

$ awk -F"-> *" 'NF>0{print(NF==1?"Void":$NF=="<<error type>>"?"Void":$NF)}' file 
Void 
Bool 
Void 
+0

Können wir auch ignorieren <> zu void ?. Kann diese Eingabe auch aus einer Zeichenfolge anstelle einer Datei entnommen werden? – prabodhprakash

+0

Konnte diese Eingabe von einer Zeichenfolge anstelle einer Datei genommen werden. – prabodhprakash

+0

@ prabodhprakash - fertig; Wenn die Eingabe aus der Zeichenfolge stammt, verwenden Sie echo 'string' | awk ...... – user31264