
Ich habe eine Zeichenfolge:
one_two_three_four_five
Ich muss in einem variablen A
Wert two
und in einem variablen B
Wert four
aus der obigen Zeichenfolge speichern
Ich verwende ksh.
Antwort1
Verwenden Sie cut
„mit“ _
als Feldtrennzeichen und erhalten Sie die gewünschten Felder:
A="$(cut -d'_' -f2 <<<'one_two_three_four_five')"
B="$(cut -d'_' -f4 <<<'one_two_three_four_five')"
Sie können echo
anstelle der Zeichenfolge „Here“ auch eine Pipe verwenden:
A="$(echo 'one_two_three_four_five' | cut -d'_' -f2)"
B="$(echo 'one_two_three_four_five' | cut -d'_' -f4)"
Beispiel:
$ s='one_two_three_four_five'
$ A="$(cut -d'_' -f2 <<<"$s")"
$ echo "$A"
two
$ B="$(cut -d'_' -f4 <<<"$s")"
$ echo "$B"
four
Beachten Sie: Wenn $s
Zeilenumbruchzeichen enthalten sind, wird ein mehrzeiliger String zurückgegeben, der das 2./4 . Feld in jeder Zeile von enthält , nicht das 2./4 . Feld in .$s
$s
Antwort2
Ich wollte eine Antwort sehen awk
, also hier ist eine:
A=$(awk -F_ '{print $2}' <<< 'one_two_three_four_five')
B=$(awk -F_ '{print $4}' <<< 'one_two_three_four_five')
Antwort3
Wenn Sie nur POSIX-sh-Konstrukte verwenden, können SieParametersubstitutionskonstrukteum jeweils ein Trennzeichen zu analysieren. Beachten Sie, dass dieser Code voraussetzt, dass die erforderliche Anzahl von Feldern vorhanden ist, da sonst das letzte Feld wiederholt wird.
string='one_two_three_four_five'
remainder="$string"
first="${remainder%%_*}"; remainder="${remainder#*_}"
second="${remainder%%_*}"; remainder="${remainder#*_}"
third="${remainder%%_*}"; remainder="${remainder#*_}"
fourth="${remainder%%_*}"; remainder="${remainder#*_}"
Alternativ können Sie eine Parameterersetzung ohne Anführungszeichen verwenden mitPlatzhaltererweiterungdeaktiviert undIFS
auf das Trennzeichen gesetzt(Dies funktioniert nur, wenn das Trennzeichen ein einzelnes Zeichen ist, das kein Leerzeichen ist, oder wenn eine beliebige Leerzeichenfolge als Trennzeichen dient.)
string='one_two_three_four_five'
set -f; IFS='_'
set -- $string
second=$2; fourth=$4
set +f; unset IFS
Dadurch werden die Positionsparameter geändert. Wenn Sie dies in einer Funktion tun, sind nur die Positionsparameter der Funktion betroffen.
Ein weiterer Ansatz für Zeichenfolgen, die keine Zeilenumbruchzeichen enthalten, ist die Verwendung des read
integrierten Elements.
IFS=_ read -r first second third fourth trail <<'EOF'
one_two_three_four_five
EOF
Antwort4
Mit zsh
könnten Sie den String (on _
) in ein Array aufteilen:
non_empty_elements=(${(s:_:)string})
all_elements=("${(@s:_:)string}")
und greifen Sie dann auf jedes/jedes Element über den Array-Index zu:
print -r -- ${all_elements[4]}
Beachten Sie, dass in zsh
(wie die meisten anderen Shells, aber anders als ksh
/ bash
)Array-Indizes beginnen bei 1.
Oder direkt in einer Erweiterung:
print -r -- "${${(@s:_:)string}[4]}"
$1
Oder verwenden Sie eine anonyme Funktion, damit die Elemente in ihrer ... verfügbar sind $2
:
(){print -r -- $4} "${(@s:_:)string}"