97

我需要将结果从 a 分配grep给一个数组......例如

grep -n "search term" file.txt | sed 's/:.*//'

这导致了一堆带有行号的行,其中找到了搜索词。

1
3
12
19

将它们分配给 bash 数组的最简单方法是什么?如果我只是将它们分配给一个变量,它们就会变成一个以空格分隔的字符串。

4

2 回答 2

159

要将命令的输出分配给数组,您需要在数组分配中使用命令替换。对于一般命令command,这看起来像:

arr=( $(command) )

在 OP 的示例中,这将显示为:

arr=($(grep -n "search term" file.txt | sed 's/:.*//'))

内部$()运行命令,而外部()使输出成为一个数组。这样做的问题是当命令的输出包含空格时它将不起作用。要处理此问题,您可以设置IFS\n.

IFS=$'\n' arr=($(grep -n "search term" file.txt | sed 's/:.*//'))

您还可以通过对数组的每个元素执行扩展来消除对 sed 的需求:

arr=($(grep -n "search term" file.txt))
arr=("${arr[@]%%:*}")
于 2012-02-26T01:07:26.340 回答
11

空格分隔的字符串很容易在 bash 中遍历。

# save the ouput
output=$(grep -n "search term" file.txt | sed 's/:.*//')

# iterating by for.
for x in $output; do echo $x; done;

# awk
echo $output | awk '{for(i=1;i<=NF;i++) print $i;}'

# convert to an array
ar=($output)
echo ${ar[3]} # echos 4th element

如果您正在考虑文件名中的空格,请使用find . -printf "\"%p\"\n"

于 2012-02-26T00:45:35.743 回答