Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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 管道链中的函数_Linux_Bash_Shell_Sed - Fatal编程技术网

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
。POSIX
sed
将(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")