J'ai besoin d'assigner 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 attribue simplement à une variable, ils deviennent une chaîne séparée par des espaces.
Pour affecter la sortie d'une commande à un tableau, vous devez utiliser une substitution de commande à l'intérieur d'une affectation de tableau. Pour une commande générale command
, cela ressemble à:
arr=( $(command) )
Dans l'exemple du PO, cela se lirait comme suit:
arr=($(grep -n "search term" file.txt | sed 's/:.*//'))
Inner $()
exécute la commande tandis que externe ()
Fait en sorte que la sortie soit un tableau. Le problème, c'est que cela ne fonctionnera pas lorsque la sortie de la commande contient 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 éliminer le besoin de sed en effectuant une expansion 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 parcourables 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 à l’espace dans le nom du fichier, utilisez find . -printf "\"%p\"\n"