So extrahieren Sie joebloggs
aus dieser Zeichenfolge in Bash mithilfe der Parametererweiterung ohne zusätzliche Prozesse ...
MYVAR="/var/cpanel/users/joebloggs:DNS9=domain.com"
NAME=${MYVAR%:*} # retain the part before the colon
NAME=${NAME##*/} # retain the part after the last slash
echo $NAME
Hängt nicht davon ab, joebloggs
dass Sie sich in einer bestimmten Tiefe des Pfades befinden.
Zusammenfassung
Eine Übersicht einiger Parametererweiterungsmodi als Referenz ...
${MYVAR#pattern} # delete shortest match of pattern from the beginning
${MYVAR##pattern} # delete longest match of pattern from the beginning
${MYVAR%pattern} # delete shortest match of pattern from the end
${MYVAR%%pattern} # delete longest match of pattern from the end
Bedeutet #
also Übereinstimmung von Anfang an (denken Sie an eine Kommentarzeile) und %
bedeutet von Ende an. Eine Instanz bedeutet die kürzeste und zwei Instanzen die längste.
Sie können Teilzeichenfolgen basierend auf der Position mithilfe von Zahlen erhalten:
${MYVAR:3} # Remove the first three chars (leaving 4..end)
${MYVAR::3} # Return the first three characters
${MYVAR:3:5} # The next five characters after removing the first 3 (chars 4-9)
Sie können bestimmte Zeichenfolgen oder Muster auch durch Folgendes ersetzen:
${MYVAR/search/replace}
Das pattern
hat das gleiche Format wie der Dateinamenabgleich, daher ist *
(beliebige Zeichen) üblich, häufig gefolgt von einem bestimmten Symbol wie /
oder.
Beispiele:
Gegeben eine Variable wie
MYVAR="users/joebloggs/domain.com"
Entfernen Sie den Pfad, der den Dateinamen hinterlässt (alle Zeichen bis zu einem Schrägstrich):
echo ${MYVAR##*/}
domain.com
Entfernen Sie den Dateinamen und verlassen Sie den Pfad (löschen Sie die kürzeste Übereinstimmung nach der letzten /
):
echo ${MYVAR%/*}
users/joebloggs
Holen Sie sich nur die Dateierweiterung (entfernen Sie alle vor dem letzten Zeitraum):
echo ${MYVAR##*.}
com
HINWEIS: Um zwei Operationen auszuführen , können Sie sie nicht kombinieren, sondern müssen einer Zwischenvariablen zugewiesen werden. So erhalten Sie den Dateinamen ohne Pfad oder Erweiterung:
NAME=${MYVAR##*/} # remove part before last slash
echo ${NAME%.*} # from the new var remove the part after the last period
domain
#
stattdessen verwenden%
. Wenn Sie nur den Teil nach dem allerletzten Doppelpunkt möchten, verwenden Sie${MYVAR##*:}
, um den Teil nach dem ersten Doppelpunkt zu erhalten, verwenden Sie${MYVAR#*:}
${RET##*$CHOP}
oder so${RET##*CHOP}
(oder auf andere Weise) eingeben? EDIT: Scheint der erstere zu sein,${RET##*$CHOP}
Definieren Sie eine Funktion wie folgt:
Und übergeben Sie die Zeichenfolge als Parameter:
quelle
echo $1 | cut -d -f 1 | xargs
. +1 für einfache und ordentliche ans.Was ist mit sed? Das funktioniert in einem einzigen Befehl:
#
werden für Regex-Teiler verwendet, anstatt dass/
die Zeichenfolge darin enthalten ist/
..*/
greift nach der Saite bis zum letzten Backslash.\( .. \)
markiert eine Erfassungsgruppe. Das ist\([^:]*\)
.[^:]
sagt ein beliebiges Zeichen _ausgenommen einen Doppelpunkt und das*
bedeutet null oder mehr..*
bedeutet den Rest der Zeile.\1
bedeutet ersetzen, was in der ersten (und einzigen) Erfassungsgruppe gefunden wurde. Das ist der Name.Hier ist die Aufschlüsselung, die die Zeichenfolge mit dem regulären Ausdruck übereinstimmt:
quelle
Mit einem einzigen sed
quelle
Verwenden eines einzelnen Awk:
Das heißt, wenn Sie entweder als Feldtrennzeichen
/
oder verwenden:
, befindet sich der Benutzername immer in Feld 5.So speichern Sie es in einer Variablen:
Für eine flexiblere Implementierung
sed
muss der Benutzername nicht Feld 5 sein:Löschen Sie also alles von
:
und darüber hinaus und löschen Sie dann alles bis zum letzten Mal/
.sed
ist wahrscheinlich auch schneller alsawk
, also ist diese Alternative definitiv besser.quelle