如何将stdin连接到一个字符串,像这样?
echo "input" | COMMAND "string"
Run Code Online (Sandbox Code Playgroud)
得到
inputstring
Run Code Online (Sandbox Code Playgroud)
sam*_*hen 109
有点哈克,但这可能是做你的问题(使用管道来接受询问的最短途径stdout,从echo "input"作为stdin另一个进程/命令:
echo "input" | awk '{print $1"string"}'
Run Code Online (Sandbox Code Playgroud)
输出:
inputstring
Run Code Online (Sandbox Code Playgroud)
你究竟想完成什么任务?更多上下文可以为您提供更好的解决方案.
更新 - 回复评论:
@NoamRoss
那么做你想要的更惯用的方式是:
echo 'http://dx.doi.org/'"$(pbpaste)"
Run Code Online (Sandbox Code Playgroud)
的$(...)语法称为命令替换.简而言之,它执行包含在新子shell中的命令,并将其stdout输出替换为$(...)在父shell中调用的位置.所以你会得到,实际上:
echo 'http://dx.doi.org/'"rsif.2012.0125"
Run Code Online (Sandbox Code Playgroud)
gle*_*man 52
使用cat -从标准输入读取,并把它$()扔掉换行符
echo input | COMMAND "$(cat -)string"
Run Code Online (Sandbox Code Playgroud)
但是,为什么不删除管道并在命令替换中获取左侧的输出:
COMMAND "$(echo input)string"
Run Code Online (Sandbox Code Playgroud)
rup*_*160 34
我经常使用管道,所以这往往是一个简单的前缀和后缀stdin的方法:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
Run Code Online (Sandbox Code Playgroud)
Vyt*_*nis 11
你可以用sed做到:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
Run Code Online (Sandbox Code Playgroud)
在你的例子中:
echo input | sed 's/.*/\0string/'
Run Code Online (Sandbox Code Playgroud)
有一些方法可以实现这一点,我个人认为最好的是:
echo input | while read line; do echo $line string; done
Run Code Online (Sandbox Code Playgroud)
另一种方法是在sed命令中用"string"替换"$"(行尾字符):
echo input | sed "s/$/ string/g"
Run Code Online (Sandbox Code Playgroud)
为什么我更喜欢前者?因为它会立即将字符串连接到stdin,例如使用以下命令:
(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done
Run Code Online (Sandbox Code Playgroud)
你马上得到了第一个输出:
input_one string
Run Code Online (Sandbox Code Playgroud)
然后在5秒后你得到另一个回声:
input_two string
Run Code Online (Sandbox Code Playgroud)
另一方面,首先使用"sed"执行括号的所有内容,然后将其赋予"sed",因此命令
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
Run Code Online (Sandbox Code Playgroud)
将输出两条线
input_one string
input_two string
Run Code Online (Sandbox Code Playgroud)
5秒后.
这对于执行函数调用的情况非常有用,这些函数需要很长时间才能完成,并且希望不断更新函数的输出.
也有效:
seq -w 0 100 | xargs -I {} echo "string "{}
Run Code Online (Sandbox Code Playgroud)
将生成如下字符串:
string 000
string 001
string 002
string 003
string 004
Run Code Online (Sandbox Code Playgroud)
...
我知道这已经晚了几年,但是您可以使用xargs -J选项完成此操作:
echo "input" | xargs -J "%" echo "%" "string"
Run Code Online (Sandbox Code Playgroud)
由于它是 xargs,因此您可以一次在文件的多行中执行此操作。如果文件“名称”有三行,例如:
Adam
Bob
Charlie
Run Code Online (Sandbox Code Playgroud)
您可以这样做:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
Run Code Online (Sandbox Code Playgroud)