Risposte:
Un po 'hacky, ma questo potrebbe essere il modo più breve per fare ciò che hai chiesto nella domanda (usa una pipe per accettare stdoutda echo "input"come stdina un altro processo / comando:
echo "input" | awk '{print $1"string"}'
Produzione:
inputstring
Quale compito stai cercando di svolgere esattamente? Un contesto più ampio può darti più indicazioni su una soluzione migliore.
Aggiorna - risposta al commento:
@NoamRoss
Il modo più idiomatico di fare ciò che vuoi è quindi:
echo 'http://dx.doi.org/'"$(pbpaste)"
La $(...)sintassi è chiamata sostituzione dei comandi . In breve, esegue i comandi racchiusi in una nuova subshell e sostituisce il suo stdoutoutput nel punto in cui è $(...)stato invocato nella shell genitrice. Quindi otterrai, in effetti:
echo 'http://dx.doi.org/'"rsif.2012.0125"
'{print $0"string"}'per afferrare l'intera cosa.
stringa ogni riga. Prova echo 'input'\n'another line' | awk '{print $0"string"}'.
usa cat -per leggere da stdin e inseriscilo $()per buttare via la nuova riga finale
echo input | COMMAND "$(cat -)string"
Tuttavia, perché non lasci cadere il tubo e prendi l'output del lato sinistro in una sostituzione di comando:
COMMAND "$(echo input)string"
Uso spesso pipe, quindi questo tende ad essere un modo semplice per aggiungere un prefisso e un suffisso allo stdin:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
pipeecat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix":? Oppure, la versione più leggibile:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
Puoi farlo con sed:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
Nel tuo esempio:
echo input | sed 's/.*/\0string/'
Ci sono alcuni modi per ottenere ciò, personalmente penso che il migliore sia:
echo input | while read line; do echo $line string; done
Un altro può essere la sostituzione di "$" (carattere di fine riga) con "stringa" in un comando sed:
echo input | sed "s/$/ string/g"
Perché preferisco il primo? Perché concatena istantaneamente una stringa a stdin, ad esempio con il seguente comando:
(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done
si ottiene subito il primo output:
input_one string
e poi dopo 5 secondi si ottiene l'altro eco:
input_two string
D'altra parte usando "sed" prima esegue tutto il contenuto della parentesi e poi lo dà a "sed", quindi il comando
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
produrrà entrambe le linee
input_one string
input_two string
dopo 5 secondi.
Questo può essere molto utile nei casi in cui si eseguono chiamate a funzioni che richiedono molto tempo per essere completate e si desidera essere continuamente aggiornati sull'output della funzione.
So che è in ritardo di alcuni anni, ma puoi farlo con l'opzione xargs -J:
echo "input" | xargs -J "%" echo "%" "string"
E poiché è xargs, puoi farlo su più righe di un file contemporaneamente. Se il file "nomi" ha tre righe, come:
Adam
Bob
Charlie
Potresti fare:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
-Jche non sembra essere standard / comune. Su Linux (di cui xargsfa parte GNU findutils) ottengo l'errore: su xargs: invalid option -- 'J'quale sistema si trova?
-Jè per la versione per Mac. Per Linux -Isvolge la stessa funzione.
cat names | xargs -I% echo "I like % because he is nice"IOW: non c'è bisogno di -n 1( xargschiama comunque echouna volta per riga di input, poiché -Iimplica -L1) Inoltre, tutte le citazioni arg separate sembrano essere ridondanti.
Il comando che hai inviato prenderebbe la stringa "input", usandola come flusso stdin di COMMAND, che non produrrebbe i risultati che stai cercando a meno che COMMAND non stampi prima il contenuto del suo stdin e poi stampi i suoi argomenti della riga di comando.
Sembra che quello che vuoi fare sia più vicino alla sostituzione dei comandi.
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
Con la sostituzione dei comandi puoi avere una riga di comando come questa:
echo input `COMMAND "string"`
Questo prima valuterà COMANDO con "stringa" come input, quindi espanderà i risultati dell'esecuzione di tale comando su una riga, sostituendo ciò che è tra i caratteri "" ".
echo input $(COMMAND "string"), piuttosto che i backtick. Buona fortuna a tutti.
pbpaste | awk '{print "http://dx.doi.org/"$1}'e ottengohttp://dx.doi.org/10.1098/rsif.2012.0125