如何创建一个带有可变参数/参数的bash函数来grep几个关键字/标签

时间:2012-10-04 20:25:33

标签: linux bash parameters tags grep

我在vim中使用:!grep "tag1" filename | grep "tag2" filename | grep -n "tag3 or more" filename命令在一个大文件中根据标签(在代码段顶部的简单注释)搜索我的代码段,类似于firefox'标签功能。我使用片段来记住棘手的事情。

每次写出都很痛苦。我想做一个别名,或者做一些像这样的事情:

:!greptag tag1 tag2 ... tag39

它应该搜索当前的文档并返回包含所有标记的行。

将Vim设置为交互式shell模式,以便它可以解析我的bashrc中的别名/函数。

set shellcmdflag=-ic "lets vim use bashrc

如何在bash中构造一个允许这样的变量参数的函数?

2 个答案:

答案 0 :(得分:2)

这样的事情怎么样:

greptags() {
 if [[ -z "$1" ]] ; then
  cat
 else
  local t="$1" ; shift
  greptags "$@" | grep "$t"
 fi
}
greptag() {
 local f="$1" ; shift
 local t="$2" ; shift
 grep "$t" "$f" | greptags "$@"
}

(未经测试,可能不是完全你想要什么,但说明了这个想法)。

答案 1 :(得分:2)

你也可以使用sed:

sed e '/tag1/!d;/tag2/!d;.../tagN/!d' filename

/tag1/!命令是一个地址前缀,告诉sed只在行包含tag1时执行命令。我们执行的命令是“d”,删除该行。

一个函数(在.bashrc中)将是:

greptags () {
    local filename="$1"
    shift
    sed "$filename" -e "$(echo "$@" | sed -e 's,\([^ ]*\) *,/\1/\!d;,g')"
}

请注意,我们使用另一个sed命令将参数解析为最终的sed命令列表。基本上,对于每个单词(没有空格),我们删除它后面的空格并将其放入/tagN/!d;命令格式。

并称之为:

greptags filename tag1 tag2 tag3 tag4

希望这有助于=)