Wie teilt man Zeichenfolgen (mehrere Zeichen) mithilfe von Zeichenfolgentrennzeichen in ein Array auf?

Wie teilt man Zeichenfolgen (mehrere Zeichen) mithilfe von Zeichenfolgentrennzeichen in ein Array auf?

Grundsätzlich möchte ich einen String mithilfe eines String-Trennzeichens wie sep.beispielsweise in ein Array aufteilen. Gibt es eine native bashMöglichkeit, dies zu tun, ohne Tools wie sed, , usw. zu verwenden? Ich weiß, dass ich einen String durch Festlegen und Verwenden awkin ein Array aufteilen kann, aber das funktioniert nicht mit String-Trennzeichen. Und wenn nicht, wie würden Sie es mit Tools wie , , usw. tun ?IFSread -rasedawk

Nehmen wir an, ich habe die Zeichenfolge This is some sep.stringund möchte sie in ein Array mit 2 Elementen aufteilen: This is someund 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/ readarrayerstellt ein Array, in dem jede Zeile ein eigenes Element ist.

verwandte Informationen