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行解释了原因)可以很好地工作,除非我遗漏了一些东西,并且这是专门格式化为在脚本文件中的。