Extrahieren Sie ein Wort aus einer Zeichenfolge in einem Shell-Skript

Extrahieren Sie ein Wort aus einer Zeichenfolge in einem Shell-Skript

Ich habe eine Zeichenfolge als $sea = xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz

und ich möchte nur DMJK.UK.1.0-32133-Z-1 extrahieren und die Suchzeichenfolge wird DMJK sein

Ich habe es versucht

echo $sea
y=${sea/\/*\//};
echo ${y/.*/};

aber es funktioniert nicht, bitte helfen Sie

Antwort1

Wie Sie entscheiden, was entfernt und was behalten werden soll, ist überhaupt nicht klar. Dies ist eine von vielen Möglichkeiten, um das gewünschte Ergebnis zu erzielen:

$ sea=xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz
$ sea2=${sea/*[[:lower:]]-/}; echo ${sea2%.*}
DMJK.UK.1.0-32133-Z-1

Alternativ umfasst dies die Teile, die mit DMJKdem letzten beginnen und weglassen .tgz:

$ sea2=${sea/*DMJK/DMJK}; echo ${sea2%.tgz}
DMJK.UK.1.0-32133-Z-1

Derselbe Ansatz funktioniert auch, wenn Folgendes .tgznicht vorhanden ist:

$ sea=xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1
$ sea2=${sea/*DMJK/DMJK}; echo ${sea2%.tgz}
DMJK.UK.1.0-32133-Z-1

Antwort2

Wie bestimmen Sie, welche Zeichen extrahiert werden sollen? Wenn die Zeichen immer an bestimmten Stellen in der Zeichenfolge erscheinen, z. B. wenn es sich um eine Zeichenfolge mit fester Länge handelt oder die benötigten Zeichen die letzten 21 Zeichen vor einem Punkt und einer 3-stelligen Erweiterung sind, können Sie in einem Bash-Skript eine der folgenden Optionen verwenden:

sea="xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz"

echo $sea
# If characters are always in positions 33 to 50
y=${sea:33:21}
echo $y

# If y always start 5 positions from the end and goes back 21 characters
# For negative numbers you need to put a space between the colon and the
# number
#
# Get the last 25 characters in the string
y=${sea: -25}
# Now discard the last 4, which are the dot and 3 character extension
y=${y:0:21}
echo $y

Antwort3

Hängt davon ab, wie Ihre Variable in anderen Instanzen aussehen könnte.

Es könnte so einfach sein wie:

echo $sea | cut -d '-' -f 7- | cut -d . -f -4

oder

echo $sea | sed 's#.*\(DMJK.*\).tgz#\1#g'

verwandte Informationen