Comment atsortingbuer la sortie d’une commande à un tableau?

Je dois atsortingbuer les résultats d’un grep à un tableau … par exemple

 grep -n "search term" file.txt | sed 's/:.*//' 

Cela a abouti à un groupe de lignes avec des numéros de ligne dans lesquels le terme de recherche a été trouvé.

 1 3 12 19 

Quel est le moyen le plus simple de les affecter à un tableau bash? Si je les atsortingbue simplement à une variable, elles deviennent une chaîne séparée par des espaces.

Pour atsortingbuer la sortie à un tableau, vous devez utiliser une substitution de commandes à l’intérieur d’une affectation de groupe.

 arr=($(grep -n "search term" file.txt | sed 's/:.*//')) 

La valeur interne $ () exécute la commande, tandis que la commande external () fait en sorte que la sortie soit un tableau. Le problème est que cela ne fonctionnera pas avec les fichiers contenant des espaces. Pour gérer cela, vous pouvez définir IFS sur \ n.

 IFS=$'\n' arr=($(grep -n "search term" file.txt | sed 's/:.*//')) unset IFS 

Vous pouvez également supprimer le besoin de sed en effectuant une extension sur chaque élément du tableau:

 arr=($(grep -n "search term" file.txt)) arr=("${arr[@]%%:*}") 

Les chaînes séparées par des espaces sont facilement traversables en bash.

 # save the ouput output=$(grep -n "search term" file.txt | sed 's/:.*//') # iterating by for. for x in $output; do echo $x; done; # awk echo $out | awk '{for(i=1;i<=NF;i++) print $i;}' # convert to an array ar=($out) echo ${ar[3]} # echos 4th element 

si vous pensez que l'espace dans le nom de fichier utilise find . -printf "\"%p\"\n" find . -printf "\"%p\"\n"