Séparer la chaîne bash par des caractères de nouvelle ligne

J’ai trouvé ça .

Et j’essaye ceci:

x='some thing' y=(${x//\n/}) 

Et je n’ai pas eu de chance, je pensais que ça pourrait fonctionner avec une double barre oblique inverse:

 y=(${x//\\n/}) 

Mais ce n’est pas le cas.

Pour tester je ne reçois pas ce que je veux je fais:

 echo ${y[1]} 

Obtenir:

 some thing 

Ce que je veux être:

 some 

Je veux y être un tableau [some, thing] . Comment puis-je faire ceci?

Autrement:

 x=$'Some\nssortingng' readarray -ty <<<"$x" 

Ou, si vous n'avez pas bash 4, l'équivalent bash 3.2:

 IFS=$'\n' read -rd '' -ay <<<"$x" 

Vous pouvez aussi le faire comme vous essayiez initialement d'utiliser:

 y=(${x//$'\n'/ }) 

Cela, cependant, ne fonctionnera pas correctement si votre chaîne contient déjà des espaces, tels que 'line 1\nline 2' . Pour que cela fonctionne, vous devez restreindre le séparateur de mots avant de l’parsingr:

 IFS=$'\n' y=(${x//$'\n'/ }) 

... et puis, comme vous modifiez le séparateur, vous n'avez plus besoin de convertir le \n en space , vous pouvez donc le simplifier pour:

 IFS=$'\n' y=($x) 

Cette approche fonctionnera à moins que $x contienne un motif de globalisation correspondant (tel que " * ") - auquel cas il sera remplacé par le ou les noms de fichiers correspondants. Les méthodes read / readarray nécessitent des versions plus récentes de bash, mais fonctionnent dans tous les cas.