Mit grep, sed oder awk nach Wörtern dazwischen suchen? Ich möchte den Paketnamen bis .el7 extrahieren können


1

Ich schreibe ein Skript (Bash / Kommandozeile) und möchte den Paketnamen bis .el7 extrahieren können

x=dbus-sharp (Ein Beispiel für einen Paketnamen - der sich ändert)

Beispiel-Textdatei:

Building dbus-sharp-0.7.0-11.fc22 for epel7
Created task: 7970206
...
0 free  1 open  1 done  0 failed
  7970225 buildArch (dbus-sharp-0.7.0-11.el7.src.rpm, ppc64): free
  7970223 buildArch (dbus-sharp-0.7.0-11.el7.src.rpm, x86_64): open (buildhw-03.phx2.fedoraproject.org)
...

im grunde will ich jetzt

y=dbus-sharp-0.7.0-11.el7

Es ist egal, ob ich grep, sed oder awk verwenden muss.

Ich hatte kein Glück, nach einer ähnlichen Lösung zu suchen.

Beispiele, die ich ausprobiert habe:

[me@h dbus-sharp]$ echo "Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a

[me@h dbus-sharp]$ cat scratchdbus-sharp | grep -Po '(?<=(dbus)).*(?= el7)'
(no output?)

[me@h dbus-sharp]$ cat scratchdbus-sharp | awk '/dbus/,/el7/'
(it dumps the whole text file?)

[me@h dbus-sharp]$ sed -n "/dbus/,/el7/p" scratchdbus-sharp
(again the whole text file is dumped)

[me@h dbus-sharp]$ grep -m 1 "dbus-sharp" scratchdbus-sharp 
Building dbus-sharp-0.7.0-11.fc22 for epel7

Ich denke, ich sollte auch beachten, dass ep el7 in der (den) Textdatei (en) enthalten sein wird, was ebenfalls eine Übereinstimmung mit 'el7' hervorruft, was die Dinge kompliziert.

Antworten:


0

Eine grepLösung:

grep -m 1 -oP 'dbus[^ ]+\.el7' file

-m 1druckt nur eine Übereinstimmung, -onur das passende Teil und -P verwendet Perl-Regex.

Und eine sedLösung:

sed -n 's/.*\(dbus.*\.el7\).*/\1/p' file | head -1

Entfernt alles davor und danach dbus.*el7und druckt es aus ( p), aber nur die erste Übereinstimmung ( head -1).


Ich habe es so verstanden: grep -m 1 -oP $(echo $x)'[^ ]+\.el7' scratchgio-sharpKannst du bitte erklären, wie du darauf gekommen bist, dieses [^] + \ zu benutzen? Oder was macht [^] + \? Vielen Dank.
Quickbooks

1
@quickbooks [^ ]+bedeutet sicher, dass sich Zeichen dazwischen befinden, die kein ^Leerzeichen sind \ . Das +heißt, es gibt mindestens einen oder mehrere von ihnen. Ich benutze das, weil die epel7 Linie auch gefunden wird. Aber mit dem Punkt vor el7-> .el7sollte es genug sein, das sollte auch funktionieren:grep -m 1 -oP 'dbus.*\.el7' file
Chaos

Vielen Dank für die Erklärung, was "[^] +" bedeutet. Ja, grep -m 1 -oP $(echo $x)'.*\.el7' scratch$xfunktioniert auch Können Sie in der alternativen Lösung, in der Sie sed verwendet haben, erläutern, wie Sie herausgefunden haben, dass s /.* \ und. * / \ 1 / alles vor und nach den Angaben in Klammern entfernen? Oder was bedeutet s /.* \ und. * / \ 1 /? Danke noch einmal.
Quickbooks

1
@quickbooks im sed-Befehl bedeutet Suchen und Ersetzen. Suchen Sie nach dem, was zwischen den ersten beiden Schrägstrichen liegt, und ersetzen Sie es durch den Schrägstrich zwischen 2 und 3. Das .*bedeutet, dass alles übereinstimmt. Der Teil in den Klammern () ist das, wonach wir suchen, gefolgt von. * (Alles erneut). Also ersetzen wir die ganze Zeile durch \ 1. \ 1 bedeutet das Untermuster in den Klammern (). Das p am Ende steht für print.
Chaos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.