Ich muss die Ergebnisse von a grep
einem Array zuweisen ... zum Beispiel
grep -n "search term" file.txt | sed 's/:.*//'
Dies führte zu einer Reihe von Zeilen mit Zeilennummern, in denen der Suchbegriff gefunden wurde.
1
3
12
19
Was ist der einfachste Weg, sie einem Bash-Array zuzuweisen? Wenn ich sie einfach einer Variablen zuordne, werden sie zu einer durch Leerzeichen getrennten Zeichenfolge.
arrays
bash
command-substitution
Decke Katze
quelle
quelle
grep
, um die Zeilennummern von etwas abzurufen und sie schließlich an ein Tool weiterzugeben, das über eine eigene Regex-Unterstützung verfügt. Dann kann es die gleichen Zeilen wiegrep
gefunden finden, ohne den Umweg zu machen, die Zeilennummern der Übereinstimmungen herauszufinden.Antworten:
Um die Ausgabe eines Befehls einem Array zuzuweisen, müssen Sie eine Befehlsersetzung innerhalb einer Arrayzuweisung verwenden. Für einen allgemeinen Befehl
command
sieht dies so aus:arr=( $(command) )
Im Beispiel des OP würde dies lauten:
arr=($(grep -n "search term" file.txt | sed 's/:.*//'))
Das Innere
$()
führt den Befehl aus, während das Äußere()
bewirkt, dass die Ausgabe ein Array ist. Das Problem dabei ist, dass es nicht funktioniert, wenn die Ausgabe des Befehls Leerzeichen enthält. Um damit umzugehen, können Sie einstellen ,IFS
auf\n
.IFS=$'\n' arr=($(grep -n "search term" file.txt | sed 's/:.*//')) unset IFS
Sie können die Notwendigkeit von sed auch verringern, indem Sie für jedes Element des Arrays eine Erweiterung durchführen:
arr=($(grep -n "search term" file.txt)) arr=("${arr[@]%%:*}")
quelle
dvmList=`grep -RohP '(?<=oramds:).+\.dvm' myFolder
`Durch Leerzeichen getrennte Zeichenfolgen können in Bash leicht durchlaufen werden.
# 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
Wenn Sie an Speicherplatz im Dateinamen denken, verwenden Sie
find . -printf "\"%p\"\n"
quelle
find . -printf "\"%p\"\n"
for x in $output
Mit einem solchenfind
Befehl wird eine Datei mit dem Namentwo words
als ein Wert"two
und ein anderer Wert durchlaufenwords"
.ar=( $output )
mitoutput
auf diese Weise zugewiesen verwenden, da die Ergebnisse der Parametererweiterung und Befehlssubstitution nicht die Analysephase zum Entfernen von Anführungszeichen durchlaufen.