将 grep 输出存储在数组中

问题描述 投票:0回答:1

我需要在目录中搜索模式并将包含它的文件的名称保存在数组中。

搜索图案:

grep -HR "pattern" . | cut -d: -f1

这会打印所有包含“模式”的文件名。

如果我尝试:

targets=$(grep  -HR "pattern" . | cut -d: -f1)
length=${#targets[@]}
for ((i = 0; i != length; i++)); do
   echo "target $i: '${targets[i]}'"
done

这仅打印一个包含具有所有文件名的字符串的元素。

output: target 0: 'file0 file1 .. fileN'

但我需要:

 output: target 0: 'file0'
 output: target 1: 'file1'
 .....
 output: target N: 'fileN'

如何在不对目标进行无聊的分割操作的情况下获得结果?

arrays bash shell grep
1个回答
113
投票

旧答案(写于 2014 年)假设输出文件名不会包含空格或通配符等特殊字符。这是将这些特殊文件名读入数组的安全方法:(适用于较旧的 bash 版本)

while IFS= read -rd ''; do
   targets+=("$REPLY")
done < <(grep --null -HRl "pattern" .)

# check content of array
declare -p targets

在 BASH 4+ 上,您可以使用

readarray
代替循环:

readarray -d '' -t targets < <(grep --null -HRl "pattern" .)

旧答案:

您可以使用:

targets=($(grep -HRl "pattern" .))

注意在 BASH 中使用

(...)
创建数组。

您还可以使用

grep -l
只获取
grep
输出中的文件名(如我的命令所示)。

© www.soinside.com 2019 - 2024. All rights reserved.