我需要在目录中搜索模式并将包含它的文件的名称保存在数组中。
搜索图案:
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'
如何在不对目标进行无聊的分割操作的情况下获得结果?
旧答案(写于 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
输出中的文件名(如我的命令所示)。