微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何用filter链过滤行

假设你有一个文本文件,比如说list.txt ,像这样:

# 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

例如,以下是期望的输出

Linux将文件重命名为大写

将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中?

如果你的grep支持-P那么你可以使用这个函数

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] 举报,一经查实,本站将立刻删除。

相关推荐