2012-03-25 2 views
-2

Eingabe enthält Dateinamen (/path/to/file), die überall verstreut sind. Ich möchte nur die /path/to/xyz.xyz (Leerzeichen oder Zeilenumbruch, aber nie '\' [ein Leerzeichen in einer Datei]).Was ist ein effektives Awk/Nawk-Muster zum Extrahieren von Pfad/Dateinamen aus der Eingabe?

Die Regel lautet:

  • Beginnt mit '/' - beginnen
  • Ende auf '' (aber nicht '\') oder '\ n'
  • Alles dazwischen.

Nur Pfade + Basisname angehängt. Nicht Basisnamen.

+0

Frage überarbeitet. – kinesis

+0

Auch nach der Bearbeitung verstehe ich immer noch nicht, was gefragt wird ... Funktionieren die Antworten für Sie? Wenn ja, markieren Sie einen von ihnen als akzeptiert. Wenn nicht, kommentieren Sie unter den Antworten die Differenz zwischen der erwarteten und der beobachteten Ausgabe. – user000001

Antwort

2

Die folgende

{ 
    r = 0; 
    s = $0; 
    do 
    { 
    r = match(s, /\/([^ ]|\\)+/); 
    if (r > 0) 
    { 
     print substr(s, RSTART, RLENGTH); 
     s = substr(s, RSTART + RLENGTH); 
    } 
    } 
    while (r > 0); 
} 

vielleicht ist das, was Sie wollten. (Hinweis: Der Pfad "/" wird nicht wegen des + gefangen, wenn Sie stattdessen * verwenden, wird er gefangen).

0

Sie könnten auf awk verlassen, um die Spaltung zu tun, damit die Dateinamen keine Leerzeichen enthalten, und dann einfach für jedes Feld suchen, die mit einem / beginnt:

awk '{ for (i = 1; i <= NF; i++) if (substr($i, 1, 1) == "/") print $i }' 
0
$ txr -c '@(freeform) 
@(coll)@{path /\/[^ \n]*/}@(end)' - 
asfasdf /foo/bar asdfasdf/xyzzy.gif /blah 
/usr/local/bin .2466 /etc 
[Ctr-D][Enter] 
path[0]="/foo/bar" 
path[1]="/xyzzy.gif" 
path[2]="/blah" 
path[3]="/usr/local/bin" 
path[4]="/etc" 

Diese Dumps die rohen Bindungen Damit kann der gesamte Befehl in Bash eval -ed sein, um ein Array zu erstellen. (Für das Ausgabeformat wurde keine Anforderung angegeben.)