如何连接 stdin 和字符串?

如何将 stdin 连接到字符串,像这样?

echo "input" | COMMAND "string"

然后

inputstring
123474 次浏览

您发布的命令将使用字符串“ 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,然后将命令执行的结果展开到一行,替换“’字符之间的内容。

有点古怪,但是这可能是完成问题中提出的要求的最简单的方法(使用一个管道将 stdoutecho "input"接受为 stdin,然后接受另一个进程/命令:

echo "input" | awk '{print $1"string"}'

产出:

inputstring

你到底想完成什么样的任务? 更多的背景知识可以为你提供更好的解决方案。

更新-回应评论:

@ NoamRoss

那么,做你想做的事情的更惯用的方法是:

echo 'http://dx.doi.org/'"$(pbpaste)"

$(...)语法称为 指令替代。简而言之,它执行包含在一个新子 shell 中的命令,并将其 stdout输出替换为在父 shell 中调用 $(...)的位置。因此,实际上你会得到:

echo 'http://dx.doi.org/'"rsif.2012.0125"

使用 cat -读取 stdin,并将其放在 $()中以丢弃尾随的换行符

echo input | COMMAND "$(cat -)string"

然而,你为什么不放下管子,抓住左边的指令替代输出:

COMMAND "$(echo input)string"

你可以用 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

5秒钟后,你会得到另一个回声:

input_two string

另一方面,使用“ sed”首先执行括号中的所有内容,然后将其赋给“ sed”,这样命令

(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"

将输出两条线

input_one string
input_two string

五秒钟之后。

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

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

我经常使用管道,所以这是一种简单的 stdin 前缀和后缀:

echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix

同样有效:

seq -w 0 100 | xargs -I {} echo "string "{}

将生成如下字符串:

string 000
string 001
string 002
string 003
string 004

...

猫将是我的选择: ls | cat - <(echo new line)

在运行 sql 脚本之前,我想在它前面加上“ set”语句。 所以我重复了“ set”指令,然后通过管道将其传递给 cat。命令 cat 接受两个参数: 标记为“-”的 STDIN 和我的 sql 文件,cat 将它们联接到一个输出。接下来,我将结果传递给 mysql 命令,以便将其作为脚本运行。

echo "set @ZERO_PRODUCTS_DISPLAY='$ZERO_PRODUCTS_DISPLAY';" | cat - sql/test_parameter.sql | mysql

P.s. mysql 登录名和密码存储在 .my.cnf文件中

和 Perl 一起

echo "input" | perl -ne 'print "prefix $_"'

产出:

prefix input

使用 SD(基本上是一个现代的 sed; 更容易使用 IMO)的解决方案:

# replace '$' (end of string marker) with 'Ipsum'
# the `e` flag disables multi-line matching (treats all lines as one)
$ echo "Lorem" | sd --flags e '$' 'Ipsum'
Lorem
Ipsum#no new line here

您可能会发现 Ipsum出现在一个新行上,而输出缺少一个 \n。原因是 echo的输出以 \n结束,而你没有告诉 sd添加一个新的 \nsd在技术上是正确的,因为它正在做你要求它做的事情,没有别的。

然而,这可能不是你的 想要,所以你可以这样做:

# replace '\n$' (new line, immediately followed by end of string) by 'Ipsum\n'
# don't forget to re-add the `\n` that you removed (if you want it)
$ echo "Lorem" | sd --flags e '\n$' 'Ipsum\n'
LoremIpsum

如果您有一个多行字符串,但是您想要在每一行的末尾添加:

$ ls
foo bar baz
$ ls | sd '\n' '/file\n'
bar/file
baz/file
foo/file