2016-11-07 1 views
0

ich einen Eingangsstrom von vielen Linien haben, die wie folgt aussehen:Sed: Extrahieren RegexMuster aus Linien

path/to/file:    example: 'extract_me.proto' 
path/to/other-file:    example: 'me_too.proto' 
path/to/something/else:    example: 'and_me_2.proto' 
... 

Ich mag würde, nur die *.proto Dateinamen aus diesen Linien zu extrahieren, und ich habe versucht:

[INPUT] | sed 's/^.*\([a-zA-Z0-9_]+\.proto\).*$/\1/' 

ich, dass ein Teil meines Problems wissen ist, dass .* gierig ist und ich werde Dinge wie e.proto und o.proto und 2.proto bekommen, aber ich kann auch nicht so weit kommen ... es gibt nur mit der gleiche Linien wie th e Eingabe. Jede Hilfe würde sehr geschätzt werden.

+0

Vielen Dank für jede Antwort! Ich habe nicht so viel Hilfe auf einmal erwartet ... Ich wünschte, ich könnte sie alle akzeptieren – AndyPerlitch

Antwort

2

Ich finde es hilfreich, erweiterte Regex für diesen Zweck zu verwenden (-r) in diesem Fall müssen Sie nicht Ihre Klammern entkommen.

sed -r 's/^.*[^a-zA-Z0-9_]([a-zA-Z0-9_]+\.proto).*$/\1/' 

Die Zugabe von [^a-zA-Z0-9_] zwingt die .* nicht gierig zu sein.

1

ein Weg, es zu tun:

sed 's/^.*[^a-zA-Z0-9_]\([a-zA-Z0-9_]\+\.proto\).*$/\1/' 
  • entkam den + char
  • eine Negation vor dem alphanum setzen + unterstreichen die führenden Zeichen

eine andere Art und Weise zu begrenzen: verwenden Single Zitat Abgrenzung, schließlich ist es hier dafür:

sed "s/^.*'\([a-zA-Z0-9_]\+\.proto\)'.*\$/\1/" 
1

verwenden sed:

sed "s/^.*'\([a-zA-Z0-9_]\+\.proto\).*$/\1/" 

+ - Extended-RegEx. Also musst du entkommen, um eine besondere Bedeutung zu bekommen. The preceding item will be matched one or more times.

Ein anderer Weg:

sed "s/^.*'\([^']\+\.proto\)'.*$/\1/" 
2

Da Sie mit Ihren Befehl Tag, ich nehme an, Sie GNU grep haben. Wählen Sie eine von

grep -oP '\w+\.proto' file 
grep -o "[^']+\\.proto" file 
1

Mit GNU sed:

sed -E "s/.*'([^']+)'$/\1/" 
Verwandte Themen