Grundsätzlich möchte ich einen String mithilfe eines String-Trennzeichens wie sep.
beispielsweise in ein Array aufteilen. Gibt es eine native bash
Möglichkeit, dies zu tun, ohne Tools wie sed
, , usw. zu verwenden? Ich weiß, dass ich einen String durch Festlegen und Verwenden awk
in ein Array aufteilen kann, aber das funktioniert nicht mit String-Trennzeichen. Und wenn nicht, wie würden Sie es mit Tools wie , , usw. tun ?IFS
read -ra
sed
awk
Nehmen wir an, ich habe die Zeichenfolge This is some sep.string
und möchte sie in ein Array mit 2 Elementen aufteilen: This is some
und string
.
Antwort1
Sie könnten die Variable manuell mit Parametererweiterung durchlaufen:
#!/bin/bash
var='This is some sep.string
with
newlines
sep.another line'
a=()
while [[ $var =~ sep\. ]]
do
e=${var%%sep.*}
a+=("${e}")
var=${var#${e}sep.}
done
a+=("${var}")
Dies durchläuft die Variable in einer Schleife (und aktualisiert sie dabei), wobei ab dem ersten Trennzeichen weiter entfernt wird ( %%
sucht nach der längsten Übereinstimmung, daher wird vom Ende der Zeichenfolge bis zur ersten Instanz von rückwärts verfolgt sep.
); dieser Rest wird dem Array hinzugefügt und dann dieser Rest und das Trennzeichen von der Vorderseite der Variablen entfernt. Iterieren Sie, bis die Variable kein Trennzeichen mehr enthält, und fügen Sie dann den Rest dem Array hinzu.
Antwort2
Eine Art native Möglichkeit, dies zu tun, indem sowohl die Parametererweiterung als auch Readarray verwendet werden
string='This is some sep.string'
mapfile -t array < <( echo "${string//sep./$'\n'}" )
${string//sep./$'\n'}
– Ersetzt Vorkommen von sep.
durch eine neue Zeile.
mapfile
/ readarray
erstellt ein Array, in dem jede Zeile ein eigenes Element ist.