138 votes

Comment concaténer stdin et une chaîne de caractères ?

Comment concaténer stdin à une chaîne, comme ceci ?

echo "input" | COMMAND "string"

et obtenir

inputstring

159voto

sampson-chen Points 13413

C'est un peu compliqué, mais c'est peut-être le moyen le plus court de faire ce que vous avez demandé dans la question (utiliser un tube pour accepter les fichiers stdout de echo "input" como stdin à 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 orienter vers une meilleure solution.

Mise à jour - réponse au commentaire :

@NoamRoss

La façon plus idiomatique de faire ce que vous voulez est alors :

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

El $(...) La syntaxe est appelée substitution de commande . En bref, elle exécute les commandes contenues dans un nouveau sous-shell, et substitue le sa stdout à l'endroit où le $(...) a été invoqué dans le shell parent. Donc vous obtiendrez, en fait :

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

72voto

glenn jackman Points 69748

Utiliser cat - pour lire depuis stdin, et le mettre dans $() pour supprimer le saut de ligne de fin

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

Cependant, pourquoi ne pas laisser tomber le pipe et récupérer la sortie du côté gauche dans une substitution de commande :

COMMAND "$(echo input)string"

64voto

rupert160 Points 799

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

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

13voto

Simone Points 577

Il existe plusieurs façons d'y parvenir, mais je pense personnellement que la meilleure est la suivante :

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

On peut aussi substituer "$" (caractère de fin de ligne) par "string" dans une commande sed :

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

Pourquoi je préfère le premier ? Parce qu'il concatène une chaîne de caractères à stdin instantanément, 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 ensuite, après 5 secondes, vous obtenez l'autre écho :

input_two string

D'autre part, en utilisant "sed", il exécute d'abord tout le contenu de la parenthèse et le donne ensuite à "sed", ainsi la commande

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

produira les deux lignes

input_one string
input_two string

après 5 secondes.

Cela peut être très utile dans les cas où vous effectuez des appels à des fonctions qui prennent beaucoup de temps pour se terminer et que vous voulez être continuellement informé de la sortie de la fonction.

11voto

Vytenis Points 359

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/'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X