我如何将stdin连接到字符串,像这样?
echo "input" | COMMAND "string"
并得到
inputstring
我如何将stdin连接到字符串,像这样?
echo "input" | COMMAND "string"
并得到
inputstring
Answers:
有点哈克,但这可能是做你的问题(使用管道来接受询问的最短途径stdout
,从echo "input"
作为stdin
另一个进程/命令:
echo "input" | awk '{print $1"string"}'
输出:
inputstring
您到底要完成什么任务?更多上下文可以为您提供更好解决方案的更多指导。
更新-回应评论:
@NoamRoss
然后,更惯用的方式做您想要的事情:
echo 'http://dx.doi.org/'"$(pbpaste)"
该$(...)
语法称为命令替换。简而言之,它将执行包含在新子外壳程序中的命令,并将其stdout
输出替换为$(...)
在父外壳程序中调用的位置。因此,您将获得以下效果:
echo 'http://dx.doi.org/'"rsif.2012.0125"
'{print $0"string"}'
抓住整个东西。
string
到每一行。尝试echo 'input'\n'another line' | awk '{print $0"string"}'
。
用于cat -
从stdin读取,并放入其中$()
以丢弃尾随的换行符
echo input | COMMAND "$(cat -)string"
但是,为什么不放下管道并在命令替换中获取左侧的输出:
COMMAND "$(echo input)string"
我经常使用管道,因此这通常是为stdin加上前缀和后缀的简便方法:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
pipe
and的非常酷的例子cat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"
?或者,更具可读性的版本:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
您可以使用sed来做到这一点:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
在您的示例中:
echo input | sed 's/.*/\0string/'
有一些方法可以做到这一点,我个人认为最好的是:
echo input | while read line; do echo $line string; done
另一个方法是在sed命令中用“ string”替换“ $”(行尾字符):
echo input | sed "s/$/ string/g"
为什么我更喜欢前者?因为它会立即将字符串连接到stdin,例如,使用以下命令:
(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done
您将立即获得第一个输出:
input_one string
然后五秒钟后,您会得到另一个回声:
input_two string
另一方面,首先使用“ sed”执行括号的所有内容,然后将其赋予“ sed”,因此命令
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
将输出两行
input_one string
input_two string
5秒后。
如果您正在执行对函数的调用,而这需要很长时间才能完成,并且想要不断地更新函数的输出,这将非常有用。
我知道这已经晚了几年,但是您可以使用xargs -J选项完成此操作:
echo "input" | xargs -J "%" echo "%" "string"
由于它是 xargs,因此您可以一次在文件的多行中执行此操作。如果文件“名称”有三行,例如:
Adam
Bob
Charlie
您可以这样做:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
-J
似乎不是标准/常见的。在Linux(xargs
的一部分GNU findutils
)上,我得到了错误:xargs: invalid option -- 'J'
这是在哪个系统上?
-J
适用于Mac版本。对于Linux -I
执行相同的功能。
cat names | xargs -I% echo "I like % because he is nice"
IOW:不需要-n 1
(反正每行输入xargs
调用echo
一次,因为-I
隐含-L1
)而且,所有单独的arg引用似乎都是多余的。
您发布的命令将字符串“ input”用作COMMAND的stdin流,除非COMMAND首先打印出其stdin的内容,然后打印出其命令行参数,否则不会产生您要查找的结果。
似乎您想要做的事情更接近于命令替换。
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
使用命令替换,您可以拥有这样的命令行:
echo input `COMMAND "string"`
这将首先使用“ string”作为输入来评估COMMAND,然后将该命令执行的结果扩展到一行,替换'`'字符之间的内容。
echo input $(COMMAND "string")
,而不是反引号。祝你们好运。
pbpaste | awk '{print "http://dx.doi.org/"$1}'
,让http://dx.doi.org/10.1098/rsif.2012.0125