我正在尝试使用数组的所有元素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
答案 0 :(得分:1)
我已经通过使用fgrep解决了这个问题,然后从命令omnidb -winfs和array的输出中删除所有空格,以便它可以完美匹配。
fgrep
或grep -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。