web-dev-qa-db-fra.com

Comment concaténer stdin et une chaîne?

Comment je concaténer stdin à une chaîne, comme ça?

echo "input" | COMMAND "string"

et obtenir

inputstring
82
Noam Ross

Un peu compliqué, mais c'est peut-être le moyen le plus rapide de faire ce que vous avez demandé dans la question (utilisez un tube pour accepter stdout de echo "input" comme stdin dans un autre processus/commande:

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

Sortie:

inputstring

Quelle tâche essayez-vous exactement d'accomplir? Plus de contexte peut vous aider à trouver une meilleure solution.

Mise à jour - répondant au commentaire:

@NoamRoss

La manière la plus idiomatique de faire ce que vous voulez est alors:

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

La syntaxe $(...) est appelée commande substitution . En bref, il exécute les commandes contenues dans un nouveau sous-shell et substitue la sortie stdout à l'endroit où la fonction $(...) a été appelée dans le Shell parent. Donc, vous obtiendriez, en effet:

echo 'http://dx.doi.org/'"rsif.2012.0125"
92
sampson-chen

utilisez cat - pour lire à partir de stdin et mettez-le dans $() pour jeter le retour à la ligne suivant

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

Cependant, pourquoi ne pas laisser tomber le tuyau et saisir la sortie du côté gauche dans une substitution de commande:

COMMAND "$(echo input)string"
44
glenn jackman

J'utilise souvent des pipes, ce qui tend à être un moyen facile de préfixer et de suffixer stdin:

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

Vous pouvez le faire avec sed:

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

Dans votre exemple:

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

Personnellement, je pense que le meilleur consiste à:

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

Un autre peut être en remplaçant "$" (caractère de fin de ligne) par "chaîne" dans une commande sed:

echo input | sed "s/$/ string/g"

Pourquoi je préfère l'ancien? Parce qu'il concatène instantanément une chaîne sur stdin, par exemple avec la commande suivante:

(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done

vous obtenez immédiatement la première sortie:

input_one string

et après 5 secondes, vous obtenez l'autre écho:

input_two string

Par contre, en utilisant "sed", il exécute tout le contenu de la parenthèse, puis le donne à "sed", de sorte que la commande

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

va sortir les deux lignes

input_one string
input_two string

après 5 secondes.

Cela peut être très utile dans le cas où vous appelez des fonctions dont l’achèvement est long et que vous souhaitez mettre à jour en permanence sur le résultat de la fonction.

8
Simone

Je sais que cela a quelques années de retard, mais vous pouvez le faire avec l'option xargs -J:

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

Et comme is xargs, vous pouvez le faire sur plusieurs lignes d’un fichier à la fois. Si le fichier 'noms' a trois lignes, comme:

Adam
Bob
Charlie

Vous pourriez faire:

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

La commande que vous avez publiée prendrait la chaîne "input" et l'utiliserait comme flux stdin de COMMAND, ce qui ne produirait pas les résultats recherchés à moins que COMMAND n'ait d'abord imprimé le contenu de son stdin, puis ses arguments en ligne de commande.

Il semble que ce que vous voulez faire soit plus proche de la substitution de commande.

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

Avec la substitution de commande, vous pouvez avoir une ligne de commande comme ceci:

echo input `COMMAND "string"`

Ceci évaluera d’abord COMMAND avec "string" en entrée, puis étendra les résultats de l’exécution de cette commande sur une ligne, en remplaçant l’espace entre les caractères "` ".

3
Max DeLiso

le chat sera mon choix: ls | cat - <(echo new line)

1
clarkttfu

Fonctionne également:

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

Générera des chaînes comme:

string 000
string 001
string 002
string 003
string 004

...

0
cy8g3n