使用带有空格

时间:2017-04-20 13:03:04

标签: arrays bash shell grep command-line-parsing

我正在尝试使用数组的所有元素grep但由于空格而破坏。

以下是我的数组的值:

server:/home/a-hkat # echo "${hitesharray2[@]}"    
ida0481.abc.xyz.net:/J 'ida0481.abc.xyz.net [/J]'

server:/home/a-hkat # declare -p hitesharray2
declare -a hitesharray2='([0]="ida0481.abt.xyz.net:/J" [1]="'\''ida0481.abc.xyz.net [/J]'\''")'

以下是错误:

server:/home/a-hkat # omnidb -winfs | grep "${hitesharray2[@]}"    
grep: 'ida0481.abc.xyz.net [/J]': No such file or directory

所需结果应如下所示,但使用数组:

server:/home/a-hkataria # omnidb -winfs | grep ida0481.abc.xyz.net:/J    
ida0481.abc.xyz.net:/J 'ida0481.abc.xyz.net [/J]' 

简而言之,我想使用数组或其他替代方法来搜索下面的行。

server:/home/a-hkat # echo "${hitesharray2[@]}"
amerfs0039.abc.xyz.net:/F 'amerfs0039.abc.xyz.net [/F]'

server:/home/a-hkat # omnidb -winfs | grep amerfs0039.abc.xyz.net:/F
amerfs0039.abc.xyz.net:/F 'amerfs0039.abc.xyz.net [/F]' WinFS

1 个答案:

答案 0 :(得分:1)

OP的解决方案

OP在评论中发布了OP,我在这里为后人纪念:

  

我已经通过使用fgrep解决了这个问题,然后从命令omnidb -winfs和array的输出中删除所有空格,以便它可以完美匹配。

fgrepgrep -F[]之类的内容视为文字,通常将其视为grep元字符。有关详情,请参阅this answer。由于OP的文本包含括号,因此使用fgrep允许字面上匹配该文本。

原始答案

您的${hitesharray2[@]}扩展为两个单词,每个单元对应一个元素。你得到的就像你说的一样

omnidb -winfs | grep "${hitesharray2[0]}" "${hitesharray2[1]}"

grep被赋予多个参数时,它会将第一个参数作为文件名。这里,第二个元素([/J])被视为文件名。

修改根据您的评论,您似乎希望将数组中的所有元素作为单个空格分隔的单词组合在一起。您可以使用:

omnidb -winfs | grep "${hitesharray2[*]}"
#        note the asterisk subscript ^

或者,如果空白量变化,您可能需要做很多事情:

omnidb -winfs | grep "${hitesharray2[0]}\s*${hitesharray2[1]}"

有关索引数组的方法的更多信息,请参阅bash-hackers wiki