shell 将grep输出存储在数组中

xsuvu9jc  于 11个月前  发布在  Shell
关注(0)|答案(1)|浏览(174)

我需要在一个目录中搜索一个模式,并将包含该模式的文件名保存在一个数组中。
搜索模式:

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

字符串
这将打印所有包含“pattern”的文件名。
如果我尝试:

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


这只打印一个包含所有filname的字符串的元素。

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


但我需要:

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


我怎样才能在不对目标进行无聊的分割操作的情况下实现结果?

x0fgdtte

x0fgdtte1#

旧的答案(写于2014年)假设输出文件名不会包含空格或globs等特殊字符。这里有一个安全的方法将这些特殊文件名读入数组:(将适用于旧的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 -lgrep的输出中只获取文件名(如我的命令所示)。

相关问题