Linux 管道链中的函数
我有这个函数,其中输入参数是搜索字符串和输入文件。函数用于文件:Linux 管道链中的函数,linux,bash,shell,sed,Linux,Bash,Shell,Sed,我有这个函数,其中输入参数是搜索字符串和输入文件。函数用于文件: f_highlite() { sed -e 's/\($1\)/\o033[91m\1\o033[39m/g' $2 } 现在我想在管道中使用这个函数。它应该如何修改 ps aux | grep java | f_highlite "Xms" - 附:我不知道这个问题的确切名称。如果你有更好的建议,就说出来 首先,您需要使用双引号,否则,$1将无法展开: f_highlite() { sed -e "s/\($
f_highlite() {
sed -e 's/\($1\)/\o033[91m\1\o033[39m/g' $2
}
现在我想在管道中使用这个函数。它应该如何修改
ps aux | grep java | f_highlite "Xms" -
附:我不知道这个问题的确切名称。如果你有更好的建议,就说出来 首先,您需要使用双引号,否则,
$1
将无法展开:
f_highlite() {
sed -e "s/\($1\)/\o033[91m\1\o033[39m/g" "$2"
}
顺便说一句,您需要确保$1
不包含被sed
理解为语法元素的字符。对于Xms
这很好
对于主题,您可以将
-
作为第二个参数传递给函数,因为sed
将-
理解为stdin:
(谢谢!)您可能还想了解另外两种方法,因为并非所有命令都支持
-
技巧
第一个是有一个在流上工作的函数,它不接受文件作为输入。您可以通过删除末尾的$2并更改调用函数的方式来实现这一点
f_highlite() {
sed -e 's/\($1\)/\o033[91m\1\o033[39m/g'
}
f_highlite <"Xms"
这(至少在概念上)创建了一个FIFO,该FIFO的输入与文件内容一起馈送,其输出与函数的输入相连。这里的关键是
当您运行管道链时,您希望发生什么?到底发生了什么?如果有,您会收到什么错误消息?预期和实际产量是多少?最后,请记住,变量(如$1
)不会在单引号字符串中展开(例如,函数中的echo'$1'
将打印文本$1
,而不是展开到第一个参数)。我希望此函数(我命名为:)突出显示搜索的字符串。例如,我有looongjava命令,希望突出显示Xms参数。我忘记了关于单引号字符串的规则,这是hek2mgl在回答中正确的。@waldauf请记住,您需要确保第一个参数正确转义;动态生成sed
命令不是一项简单的任务。@chepner您能给我一些可能会产生问题的示例吗?例如,f_highlite”/usr/bin“-
。正则表达式中的/
将提前终止s
命令中的搜索文本。您需要将'\/usr\/bin'
作为参数传递。这里不需要xargs
。POSIXsed
将(per)-
识别为输入文件,表示标准输入。@chepner谢谢。而且,这在它的当前形式中根本不起作用,因为xargs
可以调用可执行文件,但不能调用bash函数有道理,但没有做到。刚刚意识到。。。正在修复…@chepner-
效果很好!我已经在用xargs准备一些东西了。。。bash-c“f_highlight”
和导出-f
。。在这里使用-
是一个简单的解决方案!很长一段时间以来,我忽略了它作为POSIX特性的作用。我假设它会在命令描述中明确提到;在有人(Charles Duffy?)提到我之前,我从未真正阅读过语法指南。@hek2mgl此内存被刷新。;]:]]
f_highlite() {
sed -e 's/\($1\)/\o033[91m\1\o033[39m/g'
}
f_highlite <"Xms"
f_highlite() {
sed -e "s/\($1\)/\o033[91m\1\o033[39m/g" "$2"
}
f_highlite < <(<"Xms")