Question

J'ai besoin d'attribuer les résultats à partir d'un grep pour un tableau...par exemple

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

Il en est résulté une série de lignes avec des numéros de ligne dans lequel le terme de recherche a été trouvé.

1
3
12
19

Quelle est la meilleure façon de les assigner à un tableau bash?Si j'ai simplement de les affecter à une variable, ils deviennent une chaîne séparée par des espaces.

Était-ce utile?

La solution

Affecter la sortie d'une commande vers un tableau, vous devez utiliser une commande de substitution à l'intérieur d'un tableau d'affectation.Pour une commande générale command cela ressemble à:

arr=( $(command) )

Dans l'exemple de l'OP, ce serait le suivant:

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

L'intérieur $() exécute la commande, tandis que l'extérieur () les causes de la sortie d'un tableau.Le problème, c'est qu'il ne fonctionne pas quand la sortie de la commande contient des espaces.Pour gérer cela, vous pouvez définir IFS pour \n.

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

Vous pouvez également découper la nécessité pour les sed par la réalisation d'une extension sur chaque élément du tableau:

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

Autres conseils

Séparés par des espaces, les chaînes sont facilement traversable 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 $output | awk '{for(i=1;i<=NF;i++) print $i;}'

# convert to an array
ar=($output)
echo ${ar[3]} # echos 4th element

si vous êtes à la pensée de l'espace dans un nom de fichier utiliser find . -printf "\"%p\"\n"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top