Teilen Sie die Zeichenfolge nach Trennzeichen und erhalten Sie das N-te Element

Teilen Sie die Zeichenfolge nach Trennzeichen und erhalten Sie das N-te Element

Ich habe eine Zeichenfolge:

one_two_three_four_five

Ich muss in einem variablen AWert twound in einem variablen BWert fouraus 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 echoanstelle 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 $sZeilenumbruchzeichen 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')  

Probieren Sie es online aus!

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 undIFSauf 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 readintegrierten Elements.

IFS=_ read -r first second third fourth trail <<'EOF'
one_two_three_four_five
EOF

Antwort4

Mit zshkö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]}"

$1Oder verwenden Sie eine anonyme Funktion, damit die Elemente in ihrer ... verfügbar sind $2:

(){print -r -- $4} "${(@s:_:)string}"

verwandte Informationen