# Category 1 foobar # Category 2 dummy1 dummy2 dummy3 # Category 3 foobar.dummy foobar.dummy
你有一个bash脚本,比如说list.sh ,从list.txt提取行。 脚本采用一种或多种模式来用grep过滤文本文件。 从概念上讲,命令行就是这样的:
cat list.txt | grep filter1 | grep fitler1 | ... | grep filtern
但是,问题是filter的数量不同,因此您必须使用循环来执行过滤。 对于循环,我希望像下面的东西会工作。
filters=$* for filter in ${filters[@]}; do result=`ad_hoc_show $result | grep $filter` done ad_hoc_show $result # should maintain original line structure
例如,以下是期望的输出。
将grep结果打印到文件和terminal
如何search一个string(行)的特定部分的文本文件,然后将其插入到一个variables?
Bash – 在一个目录及其sbdirectories中查找几个特定的文件夹,并重命名这些特定的文件夹
在shell中回显-n不会打印正确的东西
$ list.sh foobar foobar foobar.dummy foobar.dummy $ list.sh dummy d dummy1 dummy2 dummy3
那么,关于如何实现ad_hoc_show函数的任何build议?
Bashvariables滚动不在别名内工作?
将bash中的文本string转换为数组
grep输出在bash脚本中只打印单行
如何检查有效的stringinput在bash中?
filt() { re=$(printf "(?=.*?%s)" "$@") grep -P "$re" list.txt } filt 'dummy' 'd' dummy1 dummy2 dummy3 filt 'foobar' foobar foobar.dummy foobar.dummy
更新:如果grep -P不可用,那么你可以使用awk :
filt() { re=$(printf "/%s/&&" "$@"); awk "${re:0: -2}" list.txt; } filt 'dummy' '[0-9]' dummy1 dummy2 dummy3 filt 'foobar' foobar foobar.dummy foobar.dummy
像这样的东西应该工作:
#!/bin/sh ad_hoc_show() { filter=$1 shift if [ $# -eq 0 ]; then grep "$filter" return fi grep "$filter" | ad_hoc_show "$@" } file=$1 shift ad_hoc_show "$@" <"$file"
正如David C. Rankin在他的评论中指出的那样:
对于bash ,可以通过替换来避免不必要的子shell
grep "$filter" | ad_hoc_show "$@"
同
ad_hoc_show "$@" <<<"$(grep "$filter")"
在递归调用中。
你可以通过"${@:2}" in the ad_hoc_show calls and removing the使用"${@:2}" in the calls and removing the shift行来避免使用偏移数组索引(我不知道是否有官方的术语)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。