762 Stimmen

Entfernen eines festen Präfixes/Suffixes aus einem String in Bash

Ich möchte das Präfix/Suffix aus einem String entfernen. Zum Beispiel, gegeben:

string="hello-world"
prefix="hell"
suffix="ld"

Wie bekomme ich das folgende Ergebnis?

"o-wor"

10voto

Tosi Do Punkte 113

Kleine und universelle Lösung:

expr "$string" : "$prefix\(.*\)$suffix"

9voto

Verwenden des =~ Operators:

$ string="hello-world"
$ prefix="hell"
$ suffix="ld"
$ [[ "$string" =~ ^$prefix(.*)$suffix$ ]] && echo "${BASH_REMATCH[1]}"
o-wor

7voto

markp-fuso Punkte 27770

HINWEIS: Es ist nicht sicher, ob dies bereits 2013 möglich war, aber es ist definitiv heute möglich (10. Oktober 2021), daher wird eine weitere Option hinzugefügt ...


Da wir mit bekannten festen Zeichenfolgen (prefix und suffix) arbeiten, können wir mit einer einzigen Operation ein bash-Unterstring das gewünschte Ergebnis erhalten.

Eingaben:

string="hello-world"
prefix="hell"
suffix="ld"

Plan:

  • bash-Unterstringsyntax: ${string::}
  • Wenn wir prefix="hell" überspringen, wird unser 4 sein
  • wird die Gesamtlänge von string (${#string}) minus den Längen unserer festen Zeichenfolgen sein (4 für hell / 2 für ld)

Dadurch erhalten wir:

$ echo "${string:4:(${#string}-4-2)}"
o-wor

HINWEIS: Die Klammern können entfernt werden und das Ergebnis bleibt gleich


Wenn die Werte von prefix und suffix unbekannt oder variabel sein können, können wir dennoch dieselbe Operation verwenden, aber 4 und 2 durch ${#prefix} bzw. ${#suffix} ersetzen:

$ echo "${string:${#prefix}:${#string}-${#prefix}-${#suffix}}"
o-wor

6voto

math2001 Punkte 3818

Verwendung von @Adrian Frühwirth Antwort:

function strip {
    local STRING=${1#$"$2"}
    echo ${STRING%$"$2"}
}

Verwenden Sie es so:

HELLO=":hello:"
HELLO=$(strip "$HELLO" ":")
echo $HELLO # hello

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X