Comment je concaténer stdin à une chaîne, comme ça?
echo "input" | COMMAND "string"
et obtenir
inputstring
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"
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"
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
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/'
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.
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"
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 "` ".
le chat sera mon choix: ls | cat - <(echo new line)
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
...