2012-12-14 13 views

Antwort

71

Ein bisschen hacky, aber dies könnte der kürzeste Weg zu tun, was man in der Frage gestellt (mit einem Rohr stdout von echo "input" als stdin an einem anderen Prozess/Befehl akzeptieren:

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

Ausgang:

inputstring 

Welche Aufgabe werden Sie genau zu erreichen versuchen? mehr Kontext können Sie mehr Richtung auf eine bessere Lösung.

Update - Reaktion auf Kommentar:

@NoamRoss

Je mehr idiomatische Weg zu tun, was Sie wollen, ist dann:

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

Die $(...) Syntax wird command substitution genannt. Kurz gesagt, es führt die Befehle aus, die in einer neuen Subshell enthalten sind, und ersetzt die stdout Ausgabe durch die Stelle, an der die $(...) in der übergeordneten Shell aufgerufen wurde.Also würden Sie bekommen in der Tat:

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

Danke! Das funktioniert großartig. Die genaue Aufgabe, die ich zu erreichen versuche, besteht darin, einen String aus der Zwischenablage (einem DOI) zu nehmen und ihm eine URL voranzulegen, damit ich 'pbpaste | awk '{print "http://dx.doi.org/" $ 1}' 'und bekomme' http: // dx.doi.org/10.1098/rsif.2012.0125' –

+0

@NoamRoss aktualisierte Antwort; scheinen edit;) –

+3

@ Sampson-chen, würde ich '{{$ 0 $ string} string}} verwenden, um die ganze Sache zu greifen. –

3

Der Befehl, den Sie geschrieben würde die Zeichenfolge „input“ nehmen verwenden Sie es als Befehl des stdin-Stream, der die Ergebnisse nicht produzieren würden Sie denn wenn COMMAND suchen zuerst ausgedruckt der Inhalt seiner stdin und dann seine Befehlszeilenargumente ausgedruckt.

Es scheint, als ob, was Sie tun möchten, ist näher an Befehlssubstitution.

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

Mit Befehl Substitution Sie ein Kommandozeilen wie diese haben:

echo input `COMMAND "string"` 

mit „string“ als Eingabe, und erweitern Sie dann die Ergebnisse, dass Befehle Ausführung auf einem Dieses wird zunächst auswerten COMMAND Zeile, ersetzt, was zwischen den Zeichen steht.

+0

und natürlich @NaomRoss, es sei denn, Sie Bourne-Shell zu verwenden, oder haben andere verrückt „Portabilität“ Mandate erforderlich sind, werden Sie die moderne Kommandosubstitution wie 'Echo Eingabe $ (COMMAND„string“) verwenden ', anstatt Backticks. Viel Glück für jeden. – shellter

34

Verwendung cat - von stdin zu lesen, und steckte es in $(), um die Hinter Newline

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

jedoch wegzuwerfen warum Sie nicht das Rohr fallen und greift die Ausgabe von der linken Seite in einem Befehl Substitution:

COMMAND "$(echo input)string" 
+0

Hier ein praktisches Beispiel: find ~/other_program/lib -name "* .jar" | tr '\ n' ':' | echo "$ (cat -) ~/java_app/classes" –

+0

Das funktioniert bei mir in bash, aber in zsh bekomme ich "cat: -: Input/output error". Irgendeine Idee, was könnte das verursachen? – jaymmer

9

Sie es mit Sed tun:

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

In Ihrem Beispiel:

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

Es gibt einige Möglichkeiten, dies zu erreichen, ich persönlich denke, das Beste ist:

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

Ein anderer durch Substitution "$" sein kann (Ende der Zeile Zeichen) mit "string" in einem sed Befehl:

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

Warum bevorzuge ich die ehemalige? Weil es eine Zeichenfolge verkettet sofort stdin, zum Beispiel mit dem folgenden Befehl:

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

Sie erhalten sofort die erste Ausgabe:

input_one string 

und dann nach 5 Sekunden erhalten Sie das andere Echo:

input_two string 

auf der anderen Seite mit „sed“ erste führt er den gesamten Inhalt der Klammer und dann gibt es zu „sed“, so der Befehl

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

ausgeben wird sowohl die Linien

input_one string 
input_two string 

nach 5 Sekunden.

Dies kann sehr nützlich sein in Fällen, in denen Sie Aufrufe von Funktionen ausführen, die eine lange Zeit benötigen und ständig über die Ausgabe der Funktion aktualisiert werden sollen.

+0

Tatsächlich verarbeitet die Option _sed_ auch jede Eingabezeile sofort. – tomekwi

4

Ich weiß, dass dies ein paar Jahre zu spät, aber man kann dies erreichen mit der xargs Option -J:

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

Und da es ist xargs, können Sie dies auf mehrere Zeilen einer Datei tun auf einmal.Wenn die Datei ‚Namen‘ drei Zeilen hat, wie:

Adam 
Bob 
Charlie 

könnten Sie tun:

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

Sieht cool aus, außer "-J" scheint nicht Standard/Common zu sein. Unter Linux (wo 'xargs' Teil von' GNU findutils' ist) bekomme ich den Fehler: 'xargs: ungültige Option - 'J'' Welches System ist das? – arielf

+2

'-J' ist für die Mac-Version. Für Linux "-I" führt die gleiche Funktion aus. – user2635263

+1

Danke! sehr hilfreich. Bitte beachten Sie, dass diese vereinfachte Version unter Linux genauso gut funktioniert: 'Katzennamen | xargs -I% echo "Ich mag%, weil er nett ist" 'IOW: keine Notwendigkeit für die' -n 1' ('xargs' ruft' echo' einmal pro Zeile der Eingabe auf, da '-I' '-L1 impliziert ') Auch scheinen alle separaten Argonierungen redundant zu sein. – arielf

17

Ich bin oft Rohre verwendet wird, so ist dies jedoch häufig eine einfache Möglichkeit, Präfix und Suffix stdin zu sein :

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

Danke! Das ist eigentlich ein sehr cooles Beispiel für die Verwendung von 'pipe' und' cat' –

+0

Dies sollte die beste Antwort sein. –

+0

Warum nicht einfach: "echo" meinen Standard in "| echo -e "Präfix \ n $ (cat -) \ nsuffix" '? Oder, die besser lesbare Version: "echo" mein Standard in "| printf "% s \ n% s \ n% s \ n" "Präfix" "$ (cat -)" "suffix" ' – MiniMax

Verwandte Themen