Comment puis-je créer un tableau à partir de la première ligne de plusieurs sources de texte?

8

J'ai un tableau de chemins vers des fichiers qui ont chacun plusieurs lignes de texte. Je voudrais produire un tableau rempli avec la première ligne de chaque fichier traité comme suit:

# this.txt first line is [Test this]
# another.txt first line is [Test another]
paths=(
  ./this/path/this.txt
  ./another/path/another.txt
)

for i in ${paths[@]}; do
  read -r line < $i
  lines+=$line
done

Tout au plus, je n'ai obtenu qu'une seule valeur dans mon tableau. Je n'arrive pas à sortir le tableau que je recherche de la boucle for. J'ai essayé de nombreuses variantes et j'ai du mal à comprendre où je me trompe.

dimmech
la source

Réponses:

11

Tu voulais

lines+=("$line")

+=WORD est la concaténation (ou addition) de chaînes . Une affectation composée +=(...) ajoute les valeurs au tableau.

Vous voudrez probablement également citer toutes vos extensions de variables ici - elles en ont linevraiment besoin si la ligne peut contenir des espaces, mais vous pourriez également avoir des problèmes ailleurs.

Michael Homer
la source
Merci, il est logique maintenant pourquoi, dans certaines de mes tentatives, il semblait que le résultat était un mélange des deux lignes.
dimmech
4

Dans Bash, vous pouvez également lire directement des lignes dans un tableau. Si vous sélectionnez la longueur actuelle du tableau ${#lines[@]}comme index d'insertion, vous pouvez y ajouter:

for i in "${paths[@]}"; do
    mapfile -t -n 1 -O ${#lines[@]} lines < "$i"
done

Extrait du synopsis

mapfile mapfile [-n count] [-O origin] [-t] [array]

Lisez les lignes de l'entrée standard dans le tableau de variables de tableau indexé […]. Les options, si elles sont fournies, ont les significations suivantes:

  • -n: Copier au maximum les lignes de comptage . Si count est 0, toutes les lignes sont copiées.

  • -O: Commencez l'affectation au tableau à l' origine de l' index . L'index par défaut est 0.

  • -t: Supprime une nouvelle ligne de fin de chaque ligne lue.

David Foerster
la source