【问题标题】:Giving error while using grep with array having spaces使用带有空格的数组的 grep 时出错
【发布时间】:2017-09-17 03:18:35
【问题描述】:

我正在尝试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]' 

简而言之,我想使用数组或其他替代方法对以下行进行 grep。

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

【问题讨论】:

  • 您好,我已经更新了问题,还包括了 declare -p 的输出
  • 请澄清一下,因为问题在不断变化:您想分别对每个数组值进行 grep 处理吗? (即array = (aaa bbb) 和想要omnidb -winfs | grep aaaomnidb -winfs | grep bbb )或者你想用所有数组值组合在一起的字符串进行grep? (即omnidb -winfs | grep "aaa bbb"

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


【解决方案1】:

OP的解决方案

OP在评论中发表,我在这里纪念后代:

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

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

【讨论】:

  • 我想使用 ida0481.bt.bombardier.net 进行归档:/J 'ida0481.bt.bombardier.net [/J]'
  • @HiteshKataria 你试过"${hitesharray2[*]}"吗?如果我理解正确的话,它看起来会做你想做的事。
  • 是的,我试过但没用。我在我的问题中添加了更多关于 mu 要求的细节。请检查您是否可以帮助我。
  • @HiteshKataria 尝试grep -F 与上面每个this answer 的任何选项。这将阻止 grep 将文本中的方括号解释为模式的一部分。
  • 您好,感谢您的意见。我已经通过使用 fgrep 解决了这个问题,然后从命令 omnidb -winfs 和数组的输出中删除所有空格,以便它可以完美匹配。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 2018-12-08
  • 1970-01-01
相关资源
最近更新 更多