将 grep 结果保存到数组

将 grep 结果保存到数组

我想保存与 bash 数组中的模式匹配的所有文件名。

我的解决方案不起作用。我认为问题是由于管道使用造成的,但我不知道如何解决它。

i=0
find . -type f | grep -oP "some pattern" | while read -r line; do
    arr[$i]=$line;
    let i=i+1;
done

答案1

有了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')

您的方法有几个问题:

  • 使用 时-ogrep仅打印记录中与模式匹配的部分,而不是完整记录。你不想要它在这里。
  • find的默认换行符分隔输出无法进行后期处理,因为换行符与文件路径中的任何字符一样有效。您需要 NUL 分隔的输出(因此-print0infind-zingrep来处理 NUL 分隔的记录。
  • 你还忘记传递IFS=read.
  • 在 中bash,如果没有该lastpipe选项,管道的最后一部分在子 shell 中运行,因此,您只需更新$arr该子 shell 的 。

相关内容