Bash
將 grep 結果保存到數組
我想保存與 bash 數組中的模式匹配的所有文件名。
我的解決方案不起作用。我認為問題是因為管道使用,但我不知道如何解決它。
i=0 find . -type f | grep -oP "some pattern" | while read -r line; do arr[$i]=$line; let i=i+1; done
使用
bash-4.4
及以上,您將使用:readarray -d '' -t arr < <( find . -type f -print0 | grep -zP 'some pattern')
對於舊
bash
版本:arr=() while IFS= read -rd '' file; do arr+=("$file") done < <(find . -type f -print0 | grep -zP 'some pattern')
或者(為了與
bash
沒有 zsh 樣式arr+=()
語法的舊版本兼容):arr=() i=0 while IFS= read -rd '' file; do arr[i++]=$line done < <(find . -type f | grep -zP 'some pattern')
您的方法有幾個問題:
- with
-o
,grep
僅列印與模式匹配的記錄部分,而不是完整記錄。你不想要它在這裡。find
的預設換行符分隔輸出無法後處理,因為換行符與文件路徑中的任何字元一樣有效。您需要一個以 NUL 分隔的輸出(因此在-print0
處理NUL 分隔的記錄時)。find``-z``grep
IFS=
你也忘了傳給read
.- 在 中
bash
,並且沒有該lastpipe
選項,管道的最後一部分在子外殼中執行,因此在那裡,您只會更新該$arr
子外殼的。