stdinと文字列を連結する方法は?


108

このように、stdinを文字列に連結するにはどうすればよいですか?

echo "input" | COMMAND "string"

そして得る

inputstring

回答:


119

ビットハックが、これは、あなたが質問(受け入れるためにパイプを使用して尋ねた何をすべきか最短方法かもしれない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"

1
ありがとう!これはうまくいきます。私が達成しようとしている正確なタスクは、クリップボード(DOI)から文字列を取得し、それにURLを付加することです。そのため、これを実行pbpaste | awk '{print "http://dx.doi.org/"$1}'して取得しますhttp://dx.doi.org/10.1098/rsif.2012.0125
Noam Ross

5
@ sampson-chen、私'{print $0"string"}'はすべてをつかむために使用します。
Roman Newaza 2013年

3
実際にはstringすべての行に追加されます。お試しくださいecho 'input'\n'another line' | awk '{print $0"string"}'
tomekwi 2016

55

cat -stdinから読み取っ$()て、末尾の改行を破棄するために使用します

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

しかし、なぜパイプをドロップして、コマンド置換で左側の出力を取得しないのですか。

COMMAND "$(echo input)string"

1
実用的な例を次に示します。find〜/ other_program / lib -name "* .jar" | tr '\ n' ':' | echo "$(cat-)〜/ java_app / classes"
Ashwin Jayaprakash

2
これはbashでは機能しますが、zshでは「cat:-:入出力エラー」が発生します。これを引き起こす原因は何ですか?
jaymmer-2016年

「コマンド」はソリューションを表し、「エコー入力」はさらに複雑なプロセスを表します。catへの「-」引数は、他のファイル引数がある場合にのみ必要です。それ以外の場合はデフォルトです。つまり、あなたが意味したのは、エコー入力| echo $(cat)string
Denis Howe

46

私はしばしばパイプを使用しているので、これはstdinにプレフィックスとサフィックスを付ける簡単な方法になる傾向があります:

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

2
ありがとう!実際には非常に使用した例をクールだとpipeし、cat
アレックスIvasyuv

1
これが最良の答えになるはずです
Chris Koston 2017

1
なぜだけではないのecho "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"ですか?または、より読みやすいバージョン:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
MiniMax 2017

1
@MiniMax回答はストリームでうまく機能するため、大規模なstdinでも機能します。
anishpatel 2017年

1
@anishpatel私のバージョンは大きなstdinでも動作します。変わりはない。
MiniMax

11

あなたはsedでそれを行うことができます:

seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'

あなたの例では:

echo input | sed 's/.*/\0string/'

9

これを実現する方法はいくつかありますが、個人的には次のように考えます。

echo input | while read line; do echo $line string; done

もう1つの方法は、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

5秒後。

これは、完了するまでに時間がかかり、関数の出力について継続的に更新する必要がある関数の呼び出しを実行している場合に非常に役立ちます。


実際、sedオプションは、入力のすべての行も瞬時に処理します。
tomekwi 2016

1行の入力の場合、最も簡単な解決策はエコー入力です。(vを読み取る、echo $ {v} string)これは純粋なシェルなので、sedのような追加のプロセスは必要ありません。
デニス・ハウ

7

私はこれが数年遅れていることを知っていますが、xargs -Jオプションでこれを達成できます。

echo "input" | xargs -J "%" echo "%" "string"

そして、それ xargsなので、ファイルの複数の行で一度にこれを行うことができます。ファイル 'names'に次のような3行がある場合:

Adam
Bob
Charlie

あなたがすることができます:

cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"

1
-J標準/一般的ではないように見えることを除いて、かっこいいです Linux(のxargs一部GNU findutils)でエラーが発生しました:xargs: invalid option -- 'J'これはどのシステムにありますか?
arielf 2016

3
-JMac版用です。Linuxの場合-Iも同じ機能を実行します。
user2635263

1
ありがとう!非常に便利。Linux上で、この簡易版は、同じようにうまく機能していることに注意してください: cat names | xargs -I% echo "I like % because he is nice"IOW:の必要性-n 1xargs呼び出しecho入力の行ごとに一度、とにかく、以来、-I意味は-L1)また、すべての個別の引数は引用、冗長であるように思いません。
arielf 2016

3

あなたが投稿したコマンドは、文字列「input」を取り、それをコマンドのstdinストリームとして使用します。これは、COMMANDが最初にstdinの内容を出力し、次にコマンドライン引数を出力しない限り、探している結果を生成しません。

あなたがやりたいことは、コマンド置換により近いようです。

http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution

コマンド置換を使用すると、次のようなコマンドラインを作成できます。

echo input `COMMAND "string"`

これは、最初に「文字列」を入力としてコマンドを評価し、次にそのコマンド実行の結果を行に展開して、「 `」文字の間の文字を置き換えます。


そしてもちろん@NaomRossですが、Bourneシェルを使用したり、他のクレイジーな「移植性」の義務がある場合を除きecho input $(COMMAND "string")、バッククォートではなく、のような最新のコマンド置換を使用します。皆さんお元気で。
シェルター2012

1

猫は私の選択になります: ls | cat - <(echo new line)


sedは、上流のパイプに何も出力されない場合は機能しない、行ベースのコマンドです
。– clarkttfu

0

また動作します:

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

次のような文字列を生成します:

string 000
string 001
string 002
string 003
string 004

...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.