Wie verkette ich stdin an eine Zeichenkette, so?Wie stdin und eine Zeichenfolge verketten?
echo "input" | COMMAND "string"
und bekommen
inputstring
Wie verkette ich stdin an eine Zeichenkette, so?Wie stdin und eine Zeichenfolge verketten?
echo "input" | COMMAND "string"
und bekommen
inputstring
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"
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.
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
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"
Hier ein praktisches Beispiel: find ~/other_program/lib -name "* .jar" | tr '\ n' ':' | echo "$ (cat -) ~/java_app/classes" –
Das funktioniert bei mir in bash, aber in zsh bekomme ich "cat: -: Input/output error". Irgendeine Idee, was könnte das verursachen? – jaymmer
Sie es mit Sed tun:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
In Ihrem Beispiel:
echo input | sed 's/.*/\0string/'
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.
Tatsächlich verarbeitet die Option _sed_ auch jede Eingabezeile sofort. – tomekwi
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"
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
'-J' ist für die Mac-Version. Für Linux "-I" führt die gleiche Funktion aus. – user2635263
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
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
Danke! Das ist eigentlich ein sehr cooles Beispiel für die Verwendung von 'pipe' und' cat' –
Dies sollte die beste Antwort sein. –
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
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' –
@NoamRoss aktualisierte Antwort; scheinen edit;) –
@ Sampson-chen, würde ich '{{$ 0 $ string} string}} verwenden, um die ganze Sache zu greifen. –