Bash 使用管道输出的每一行作为脚本的参数

Bash 使用管道输出的每一行作为脚本的参数,bash,grep,pipeline,Bash,Grep,Pipeline,我有一个应用程序(myapp),它提供多行输出 结果: abc|myparam1|def ghi|myparam2|jkl mno|myparam3|pqr stu|myparam4|vwx 使用grep和sed,我可以获得如下参数 myapp | grep '|' | sed -e 's/^[^|]*//' | sed -e 's/|.*//' 但是,我们希望这些myparamx值作为脚本的参数为每个参数执行 myscript.sh myparam1 myscript.sh myp

我有一个应用程序(myapp),它提供多行输出

结果:

abc|myparam1|def
ghi|myparam2|jkl
mno|myparam3|pqr
stu|myparam4|vwx
使用grep和sed,我可以获得如下参数

myapp | grep '|' | sed -e 's/^[^|]*//' | sed -e 's/|.*//'  
但是,我们希望这些myparamx值作为脚本的参数为每个参数执行

myscript.sh myparam1  
myscript.sh myparam2
etc.

非常感谢您的帮助

请参见
xargs
。例如:

myapp | grep '|' | sed -e 's/^[^|]*//' | sed -e 's/|.*//' | xargs -n 1 myscript.sh

请参见
xargs
。例如:

myapp | grep '|' | sed -e 's/^[^|]*//' | sed -e 's/|.*//' | xargs -n 1 myscript.sh

也许这有助于-

myapp | awk -F"|" '{ print $2 }' | while read -r line; do /path/to/script/ "$line"; done

也许这有助于-

myapp | awk -F"|" '{ print $2 }' | while read -r line; do /path/to/script/ "$line"; done

我喜欢黑暗猎鹰的
xargs-n1
解决方案,而
while read
是这类事情的经典工具,但只是为了完整性:

myapp | awk -F'|' '{print "myscript.sh", $2}' | bash
作为旁注,关于第二个字段的提取,您可以使用
cut

myapp | cut -d'|' -f 1 # -f 1 => second field, starting from 0

我喜欢黑暗猎鹰的
xargs-n1
解决方案,而
while read
是这类事情的经典工具,但只是为了完整性:

myapp | awk -F'|' '{print "myscript.sh", $2}' | bash
作为旁注,关于第二个字段的提取,您可以使用
cut

myapp | cut -d'|' -f 1 # -f 1 => second field, starting from 0

Pfff,几乎不可能在这里发布双sed的无用使用
sed-e/^[^ |]*/'| sed-e/|.*/'
可以写成
sed-e/^[^ |]*/'-e/.*/'
甚至
sed-e/^[^ |]*/';s/|.*/'
是的,但是sed已经很难阅读,所以双sed是为了让阅读更容易。谢谢你,嗯。。。“将空格读作管道符号,不让我张贴”。管道符号有什么问题吗?Pfff,几乎不可能在这里发布双sed的无用用法
sed-e/^[^ |]*/'| sed-e/|.*/'
可以写成
sed-e/^[^ |]*/'-e/.*/'
甚至
sed-e/^[^ |]*/';s/|.*/'
是的,但是sed已经很难阅读,所以双sed是为了让阅读更容易。谢谢你,嗯。。。“将空格读作管道符号,不让我张贴”。管道符号有什么问题吗?刚刚发现xargs确实是一种方式。刚刚发现xargs确实是一种方式。谢谢你的回答,非常有用。只是一个提示,我觉得你应该用一个
cut
cut-f2-d'.
来代替
sed
。刚刚发现xargs确实是一条路要走。刚刚发现xargs确实是一条路要走。谢谢您的回答,非常有用。请注意,我觉得您应该用一个
cut
来替换
sed
cut-f2-d'