Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何创建带有可变参数/参数的bash函数来grep多个关键字/标记_Linux_Bash_Parameters_Tags_Grep - Fatal编程技术网

Linux 如何创建带有可变参数/参数的bash函数来grep多个关键字/标记

Linux 如何创建带有可变参数/参数的bash函数来grep多个关键字/标记,linux,bash,parameters,tags,grep,Linux,Bash,Parameters,Tags,Grep,我正在使用:!vim中的grep“tag1”filename | grep“tag2”filename | grep-n“tag3或更多”filename命令根据一个大文件中的标记(代码段顶部的简单注释)搜索我的代码段,类似于firefox的标记功能。我用片段来记住棘手的事情 每次写出来都很痛苦。我想创建一个别名或函数来执行以下操作: :!greptag tag1 tag2 ... tag39 greptags() { if [[ -z "$1" ]] ; then cat else

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

每次写出来都很痛苦。我想创建一个别名或函数来执行以下操作:

:!greptag tag1 tag2 ... tag39
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 "$@"
}
它应该搜索当前文档并返回带有所有标记的行

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

set shellcmdflag=-ic "lets vim use bashrc

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

这样的函数怎么样:

:!greptag tag1 tag2 ... tag39
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 "$@"
}

(未经测试,可能不完全是您想要的,但说明了想法)。

这样的东西怎么样:

:!greptag tag1 tag2 ... tag39
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 "$@"
}

(未经测试,可能不是您想要的,但说明了想法)。

您也可以使用sed:

sed e '/tag1/!d;/tag2/!d;.../tagN/!d' filename
/tag1/
command是一个地址前缀,用于告诉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

希望这有帮助=)

您也可以使用sed:

sed e '/tag1/!d;/tag2/!d;.../tagN/!d' filename
/tag1/
command是一个地址前缀,用于告诉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

希望这有帮助=)

问题是原始代码查找所有标记,而不是任何标记。从终端(在带有示例.txt文件的目录中)将其称为
$greptags tagname filename
)会打印出
sed:-e表达式#1,char 20:s命令的RHS上的无效引用\1
对不起。。。有一些东西不见了。修正它=)这太棒了!非常感谢。我喜欢sed。问题是原始代码查找所有标记,而不是任何标记。从终端(使用sample.txt文件在目录中插入)将其称为
$greptags tagname filename
,打印出
sed:-e expression#1,char 20:s命令的RHS上的无效引用\1
对不起。。。有一些东西不见了。修正它=)这太棒了!非常感谢。我喜欢sed。它没有抛出任何错误,但就我所知,它也不起作用。我尝试了
:!greptags“example_tag”文件名
,没有文件名,没有运气。看起来我无法避免学习bash;p供我参考,函数的哪一部分允许多个参数?vim没有“看到”bash函数,请将代码放入脚本中。实际上,另一个答案在我将其粘贴到bashrc后,从vim(我问题中的最后3行解释了原因)可以很好地工作,除非我遗漏了一些东西,并且这是专门格式化为在脚本文件中的。它没有抛出任何错误,但就我所知,它也不能正常工作。我尝试了
:!greptags“example_tag”文件名
,没有文件名,没有运气。看起来我无法避免学习bash;p供我参考,函数的哪一部分允许多个参数?vim没有“看到”bash函数,请将代码放入脚本中。实际上,另一个答案在我将其粘贴到bashrc后,从vim(我问题中的最后3行解释了原因)可以很好地工作,除非我遗漏了一些东西,并且这是专门格式化为在脚本文件中的。