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.
grep -m 1 -oP $(echo $x)'[^ ]+\.el7' scratchgio-sharp
Kannst du bitte erklären, wie du darauf gekommen bist, dieses [^] + \ zu benutzen? Oder was macht [^] + \? Vielen Dank.[^ ]+
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 vorel7
->.el7
sollte es genug sein, das sollte auch funktionieren:grep -m 1 -oP 'dbus.*\.el7' file
grep -m 1 -oP $(echo $x)'.*\.el7' scratch$x
funktioniert 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..*
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.