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 read
gebruiken 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 $STR
die 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 cut
gekozen omdat je de code eenvoudig kunt uitbreiden voor nog een paar variabelen…
Antwoord 4, autoriteit 19%
Klinkt als een taak voor set
met een aangepaste IFS
.
IFS=-
set $STR
var1=$1
var2=$2
(U wilt dit doen in een functie met een local IFS
zodat u geen andere delen van uw script verknoeit waar u IFS
nodig 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