Hoe splits ik een string in meerdere variabelen in bash-shell?

Ik heb naar een oplossing gezocht en soortgelijke vragen gevonden, alleen probeerden ze zinnen te splitsen met spaties ertussen, en de antwoorden werken niet voor mijn situatie.

Momenteel wordt een variabele ingesteld op een string zoals deze:
ABCDE-123456
en ik zou dat willen opsplitsen in 2 variabelen, terwijl ik de “” elimineer. d.w.z.:
var1=ABCDE
var2=123456

Hoe is het mogelijk om dit te realiseren?


Dit is de oplossing die voor mij werkte:
var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)

Is het mogelijk om de opdracht knippente gebruiken die werkt zonder scheidingsteken (elk teken wordt als variabele ingesteld)?

var1=$(echo $STR | cut -f1 -d?)
var2=$(echo $STR | cut -f1 -d?)
var3=$(echo $STR | cut -f1 -d?)
etc.


Antwoord 1, autoriteit 100%

Als u een string wilt splitsen, gescheiden door -, kunt u readgebruiken met IFS:

$ IFS=- read var1 var2 <<< ABCDE-123456
$ echo "$var1"
ABCDE
$ echo "$var2"
123456

Bewerken:

Hier leest u hoe u elk afzonderlijk teken in array-elementen kunt lezen:

$ read -a foo <<<"$(echo "ABCDE-123456" | sed 's/./& /g')"

Dump de array:

$ declare -p foo
declare -a foo='([0]="A" [1]="B" [2]="C" [3]="D" [4]="E" [5]="-" [6]="1" [7]="2" [8]="3" [9]="4" [10]="5" [11]="6")'

Als er spaties in de tekenreeks staan:

$ IFS=$'\v' read -a foo <<<"$(echo "ABCDE 123456" | sed 's/./&\v/g')"
$ declare -p foo
declare -a foo='([0]="A" [1]="B" [2]="C" [3]="D" [4]="E" [5]=" " [6]="1" [7]="2" [8]="3" [9]="4" [10]="5" [11]="6")'

Antwoord 2, autoriteit 83%

Als je weet dat het maar twee velden zijn, kun je de extra subprocessen als volgt overslaan, met :

var1=${STR%-*}
var2=${STR#*- }

Wat doet dit? ${STR%-*}verwijdert de kortste substring van $STRdie overeenkomt met het patroon -*vanaf het einde van de string. ${STR#*- }doet hetzelfde, maar met het *-patroon en beginnend bij het begin van de string. Ze hebben elk tegenhangers %%en ##die de langsteverankerde patroonovereenkomst vinden. Als iemand een handig geheugensteuntje heeft om te onthouden welke dat doet, laat het me weten! Ik moet altijd beide proberen om te onthouden.

Zie de bash-documentatievoor meer informatie.


Antwoord 3, autoriteit 70%

Alsuw oplossing niet algemeen hoeft te zijn, d.w.z. alleen hoeft te werken voor strings zoals uw voorbeeld, kunt u het volgende doen:

var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)

Ik heb hier cutgekozen omdat je de code eenvoudig kunt uitbreiden voor nog een paar variabelen…


Antwoord 4, autoriteit 19%

Klinkt als een taak voor setmet een aangepaste IFS.

IFS=-
set $STR
var1=$1
var2=$2

(U wilt dit doen in een functie met een local IFSzodat u geen andere delen van uw script verknoeit waar u IFSnodig heeft om te zijn wat je verwacht.)


Antwoord 5, autoriteit 13%

Bash regex-mogelijkheden gebruiken:

re="^([^-]+)-(.*)$"
[[ "ABCDE-123456" =~ $re ]] && var1="${BASH_REMATCH[1]}" && var2="${BASH_REMATCH[2]}"
echo $var1
echo $var2

UITVOER

ABCDE
123456

Other episodes