Ich möchte aufgeteilt 'hello'
in h e l l o
nur bash unter Verwendung in einem Array, konnte ich es mit in sed tun , sed 's/./& /g'
aber ich möchte wissen , wie eine Zeichenfolge in ein Array in Bash aufzuspalten , wenn ich nicht weiß , was das Trennzeichen wäre, oder das Trennzeichen ist jedes einzelnes Zeichen. Ich glaube nicht, dass ich ${i// /}
ohne etwas Kreativität verwenden kann, da das Trennzeichen ein Unbekannter ist, und ich glaube nicht, dass dieser Ausdruck Regex akzeptiert. Ich habe versucht, BASH_REMATCH mit [[string = ~ ([az].). *]] Zu verwenden, aber es funktioniert nicht wie erwartet. Was ist der richtige Weg, um nur Bash zu verwenden, um eine string.split()
Art von Verhalten zu erreichen? Der Grund ist, dass ich versuche, das rev-Dienstprogramm in allen Bashs zu schreiben:
while read data; do
word=($(echo $data|tr ' ' '_'|sed 's/./& /g'))
new=()
i=$((${#word[@]} - 1))
while [[ $i -ge 0 ]]; do
new+=(${word[$i]})
(( i-- ))
done
echo ${new[@]}|tr -d ' '|tr '_' ' '
done
Aber ich habe tr und sed verwendet, ich möchte wissen, wie man den Split richtig macht, und dann werde ich ihn so reparieren, dass alles Bash ist. Nur zum Spaß.
[[ $string =~ ${string//?/(.)} ]]
wirdBASH_REMATCH[]
nach Bedarf eingestellt, siehe meine Antwort auf die Frage, auf die Peter Mortensen verweist, für eine Erklärung.Antworten:
Ausgabe:
oder (bitte beachten Sie die Kommentare)
Ausgabe:
quelle
while read -N 1 c; do a+=("$c"); done <<< "$s"
. Das-N
erlaubt, sogar Zeilenumbrüche zu lesen, und die Anführungszeichen("$c")
vermeiden die Erweiterung des Pfadnamens (und einige andere Probleme).while read -N 1 c; do a+=("$c"); done <<< "$s"x
und löschen Sie dann die letzte neue Zeile und das hinzugefügte x :unset a[${#a[@]}-1]; unset a[${#a[@]}-1]
.Um die Zeichenfolge mit einem Nulltrennzeichen in ein Zeichenarray aufzuteilen, können Sie:
Mit einem anderen Trennzeichen als null können Sie:
quelle
IFS
kann, können Sie einfach :IFS=',' arr=($str)
.Nur zum Spaß (und andere Muscheln) andere Variante:
Und prüfe
wird gedruckt
quelle
Methode 1:
Einzeiler:
Erweiterter Code:
Methode 2:
Einzeiler:
Erweiterter Code:
Vielen Dank an @cuonglm durch seinen Vorschlag. Tatsächlich
können Sie
$REPLY
die Standardvariable verwenden, inread
der die Eingabe gelesen wird.quelle
$REPLY
anstelle vonchar
Variablen verwenden.