在Shell编程中给定以下数组foo=(spi蜘蛛蜘蛛蜘蛛侠酒吧lospia)我想使用GREP搜索数组中包含3个字母spi的所有单词正确输出:蜘蛛人蜘蛛人我试过类似的方法
spi
foo=(spi spid spider spiderman) grep "spi" foo
但似乎这是错误的,什么是正确的方式去做它???
mum43rcc1#
最简单的解决方案是将数组元素通过管道传输到grep中:
printf -- '%s\n' "${foo[@]}" | grep spi
几个注意事项:
printf是一个bash内置函数,你可以用man printf来查找它。--选项告诉printf后面的内容不是命令行选项。这可以防止你在foo数组中有字符串被解释成这样。
man printf
--
foo
"${foo[@]}"表示法将数组中的所有元素扩展为独立的参数。总之,数组中的单词被放入一个多行字符串中,并通过管道传输到grep中,grep将每一行与 spi 进行匹配。
"${foo[@]}"
f45qwnt82#
下面的代码将打印出所有包含spi的单词:
foo=(spi spid spider spiderman bar) for i in ${foo[*]} do echo $i | grep "spi" done
r1zhe5dt3#
IFS=$'\n' ; echo "${foo[*]}" | grep spi
这会产生输出:
spi spid spider spiderman lospia
vlju58qv4#
如果需要在exit-on-error shell标志('-e')下运行脚本/extract,并且不必要地退出脚本/extract,同时避免用“set +e”...“set -e” Package 代码的繁琐,我总是使用case,因为与grep(1)或test(1)不同,它(case)不更新$?...
for f in "${foo[@]}" ; do case "$f" in *spi*) echo $f ;; esac done
4条答案
按热度按时间mum43rcc1#
最简单的解决方案是将数组元素通过管道传输到grep中:
几个注意事项:
printf是一个bash内置函数,你可以用
man printf
来查找它。--
选项告诉printf后面的内容不是命令行选项。这可以防止你在foo
数组中有字符串被解释成这样。"${foo[@]}"
表示法将数组中的所有元素扩展为独立的参数。总之,数组中的单词被放入一个多行字符串中,并通过管道传输到grep中,grep将每一行与 spi 进行匹配。f45qwnt82#
下面的代码将打印出所有包含spi的单词:
r1zhe5dt3#
这会产生输出:
vlju58qv4#
如果需要在exit-on-error shell标志('-e')下运行脚本/extract,并且不必要地退出脚本/extract,同时避免用“set +e”...“set -e” Package 代码的繁琐,我总是使用case,因为与grep(1)或test(1)不同,它(case)不更新$?...