我想将每个输出存储在双引号数组值中。值也可以有空间。
FOUNDFILES=($(locate --database ~/.locate.db -i -b "$INPUT"))
如果locate命令的输入是非常非常最新的(其中非常非常最新的是文件名)。它应该存储为“非常最新”。定位还可以定位其中包含单词very的其他文件。因此,如果存在像 heisvery 这样的其他文件,它也应该像“heisvery”一样存储,其中“veryverylatest”是数组的第 0 个值,“heisvery”是数组的值 1。
答案1
实际上,您实际上需要存储字符串(在变量中)以及不属于数据一部分的前导和尾随引号,这确实是一种罕见的情况。通常最好进行后处理。
var='two spaces'
printf '# "%s"\n' "$var"
# "two spaces"
ary=( 'two spaces' '$USER' )
printf '# "%s"\n' "${ary[@]}"
# "two spaces"
# "$USER"
作为locate
输出完全合格的路径,
该-b
选项表示仅搜索乙asename,
你想要仅有的要捕获的基本名称,
然后您可以使用sed
它来删除该/pa/th/
部分。
当您想要搜索“非常最新”时满的基本名称,
并且您还想搜索“very”任何地方在基本名称中,
那么你真的需要使用正则表达式搜索。
-r
搜索基本正则表达式--regex
搜索扩展的正则表达式(在下面的示例中使用)
要使您的数组捕获整行,您需要更改我内部F田地S分离器(IFS)\n
仅。
请注意,数组项在遇到时被捕获/存储定位的输出。为了将它们排列成与数组相同的顺序input
,需要对数组进行一些进一步的处理(通过for..grep..loop..awk以下)。
input=( '^very very latest$' 'very' )
IFS=$'\n'; foundfiles=($(locate -i -b --regex "${input[@]}" | sed 's|.*/||'))
foundfiles=($(for((i=0;i<${#input[@]};i++))
do printf '%s\n' "${foundfiles[@]}" | grep -E "${input[i]}"
done | awk '!seen[$0]++'))
printf '%s\n' "${foundfiles[@]}"
输出 - 显示完整数组,即索引 [0] 和 [1]:
very very latest
heisvery
如果你想要打印函数输出用引号括起来,只需将最后一行更改为
printf '"%s"\n' "${foundfiles[@]}"
...或者如果您仍然需要将引号添加到数组本身中,请在for..grep..loop
foundfiles=("${foundfiles[@]/#/\"}")
foundfiles=("${foundfiles[@]/%/\"}")
输出 - 显示完整数组,即索引 [0] 和 [1]:
"very very latest"
"heisvery"
答案2
我认为你不想要引号。我认为您只是不想在不是换行符的空白上拆分为字段。
操作方法如下: https://stackoverflow.com/questions/11393817/bash-read-lines-in-file-into-an-array
这是一个例子
$ IFS=$'\n' read -d '' -r -a FOUNDFILES < <(echo -e "very very latest\nsome other line")
$ echo "${FOUNDFILES[0]}"
very very latest
$ echo "${FOUNDFILES[1]}"
some other line
<(echo -e "very very latest\nsome other line")
真的是你的locate
命令。