Wie teile ich eine Zeichenfolge gegen ein Zeichen in BASH?

7

Ich möchte in der Lage sein, einen Autorisierungscode nach -Zeichen zu teilen , damit ich jedes Segment einzeln bearbeiten kann. Ich möchte keine externen Binärdateien ( awk, grep) verwenden - dies soll so minimalistisch wie möglich sein. Wie kann ich das erreichen?

Hier ist ein Beispiel für einen Authentifizierungscode:

82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb

Jay Hellwig
quelle
Normalerweise würden Sie cut verwenden. Warum aber die Beschränkung auf externe Binärdateien?
Grant
Dies ist auf einem eingebetteten Linux-Gerät mit eingeschränktem Zugriff darauf.
Jay Hellwig

Antworten:

15

Versuchen Sie es mit dem internen Feldtrennzeichen ( IFS):

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'

OIFS=$IFS                   # store old IFS in buffer
IFS='-'                     # set IFS to '-'

for i in ${AUTH_CODE[@]}    # traverse through elements
do
  echo $i
done

IFS=$OIFS                   # reset IFS to default (whitespace)

Ausgabe:

82a8
bd7d
986d
9dc9
41f5
fc02
2c20
3175
097a
c1eb

Durch Festlegen des internen Feldtrennzeichens teilen Sie AUTH_CODEdas -Zeichen auf, sodass Sie die neu erstellten Elemente in einer foreachSchleife durchlaufen können .

Daniel Li
quelle
Wenn Sie IFS nicht von seiner Standardeinstellung geändert haben, können Sie das Speichern des IFS-Werts in OIFS-Teilen ignorieren, unset IFSsobald Sie fertig sind.
Violett
Könnten Sie die Syntax erklären ${AUTH_CODE[@]}? Ist das , [@]was bash bewirkt , dass die Zeichenfolge aufgeteilt?
Sam Goldberg
Ich habe dies unter Linux getestet, es scheint, dass nur das IFS eingestellt werden musste, und danach ist die Zeichenfolge bereits geteilt. dh: `OIFS = $ IFS; IFS = '-'; für s in $ AUTH; Echo $ s; erledigt; IFS = $ OIFS` Das [@]schien überhaupt nicht benötigt zu werden?
Sam Goldberg
5

Sie können IFS verwenden, dies ist jedoch einfacher:

echo "82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb"- \
  | while read -d - i; do echo "$i"; done

Bitte beachten Sie, dass -nach dem Teilen eine Zeichenfolge zum Teilen hinzugefügt wurde . Andernfalls wird das letzte Token ignoriert.

Tometzky
quelle
1
Dies fügt jedoch nicht die Lesbarkeit hinzu, die ich möchte, da die Operationen für jedes Element ziemlich intensiv sind
Jay Hellwig
2
Ich verstehe nicht Was ist nicht lesbar? Sie müssen dies nicht in einer Zeile tun - Sie können zwischen dound so viele Zeilen haben, wie Sie möchten done.
Tometzky
4

Ein anderer Weg mit Pattern Matching und Array:

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'
array=( ${AUTH_CODE//-/ } )
for j in ${array[@]} ; do echo $j ; done
ott--
quelle
2

Verwenden Sie einfach die Parametererweiterung:

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'
echo "${AUTH_CODE//-/$'\n'}"

Ausgabe:

82a8
bd7d
986d
9dc9
41f5
fc02
2c20
3175
097a
c1eb
Thor
quelle
0
for i in {1..10}; do echo '82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'|cut -d"-" -f$i;done
Tom
quelle
Möglicherweise haben Sie den Teil "Keine externen Binärdateien" verpasst.
Nickgrim