Bash

將 grep 結果保存到數組

  • October 4, 2018

我想保存與 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 -ogrep僅列印與模式匹配的記錄部分,而不是完整記錄。你不想要它在這裡。
  • find的預設換行符分隔輸出無法後處理,因為換行符與文件路徑中的任何字元一樣有效。您需要一個以 NUL 分隔的輸出(因此在-print0處理NUL 分隔的記錄時)。find``-z``grep
  • IFS=你也忘了傳給read.
  • 在 中bash,並且沒有該lastpipe選項,管道的最後一部分在子外殼中執行,因此在那裡,您只會更新該$arr子外殼的。

引用自:https://unix.stackexchange.com/questions/362444