如何连接stdin和一个字符串?

Noa*_*oss 97 bash

如何将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)

  • @ sampson-chen,我会用''{print $ 0"string"}'`抓住整个东西. (4认同)
  • 它实际上将`string`附加到每一行.尝试'echo'输入'\n另一行'| awk'{print $ 0"string"}'`. (2认同)

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)

  • 这在 bash 中对我有用,但在 zsh 中我得到“cat:-:输入/输出错误”。知道什么可能导致这种情况吗? (4认同)
  • 这是一个实际示例: find ~/other_program/lib -name "*.jar" | tr '\n' ':' | echo "$(cat -)~/java_app/classes" (2认同)

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)

  • 谢谢!这实际上是使用 `pipe` 和 `cat` 的非常酷的例子 (2认同)
  • @MiniMax因为答案适用于流,所以它适用于大型标准输入。 (2认同)

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)


Sim*_*one 9

有一些方法可以实现这一点,我个人认为最好的是:

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秒后.

这对于执行函数调用的情况非常有用,这些函数需要很长时间才能完成,并且希望不断更新函数的输出.


Dmi*_*try 7

也有效:

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)

...


use*_*263 5

我知道这已经晚了几年,但是您可以使用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)

  • -J适用于Mac版本。对于Linux,-I执行相同的功能。 (2认同)
  • 谢谢!很有用。请注意,在 Linux 上,这个简化版本同样适用:`cat names | xargs -I% echo “我喜欢 % 因为他很好”` IOW:不需要`-n 1`(无论如何,`xargs` 在每行输入中调用 `echo` 一次,因为 `-I` 意味着 `-L1 `) 此外,所有单独的 arg 引用似乎都是多余的。 (2认同)