Antworten:
Ein bisschen hacky, aber dies könnte der kürzeste Weg zu tun , was man in der Frage gestellt (ein Rohr verwenden zu akzeptieren stdout
aus echo "input"
als stdin
zu einem anderen Prozess / Befehl ein :
echo "input" | awk '{print $1"string"}'
Ausgabe:
inputstring
Welche Aufgabe versuchst du genau zu erfüllen? Mehr Kontext kann Ihnen mehr Orientierung für eine bessere Lösung geben.
Update - Antwort auf Kommentar:
@ NoamRoss
Die idiomatischere Art, das zu tun, was Sie wollen, ist dann:
echo 'http://dx.doi.org/'"$(pbpaste)"
Die $(...)
Syntax wird als Befehlssubstitution bezeichnet . Kurz gesagt, es führt die Befehle aus, die in einer neuen Subshell enthalten sind, und ersetzt die stdout
Ausgabe dort, wo sie $(...)
in der übergeordneten Shell aufgerufen wurde. Sie würden also tatsächlich Folgendes erhalten:
echo 'http://dx.doi.org/'"rsif.2012.0125"
'{print $0"string"}'
, um die ganze Sache zu schnappen.
string
an jede Zeile angehängt . Versuchen Sie es echo 'input'\n'another line' | awk '{print $0"string"}'
.
Verwenden cat -
Sie diese $()
Option , um aus stdin zu lesen, und setzen Sie sie ein, um die nachfolgende Newline wegzuwerfen
echo input | COMMAND "$(cat -)string"
Warum lassen Sie die Pipe jedoch nicht fallen und greifen bei einer Befehlsersetzung auf die Ausgabe der linken Seite zu:
COMMAND "$(echo input)string"
Ich benutze oft Pipes, daher ist dies eine einfache Möglichkeit, stdin voranzustellen und zu ergänzen:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
pipe
undcat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"
? Oder die besser lesbare Version:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
Sie können 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
Eine andere Möglichkeit besteht darin, "$" (Zeilenendezeichen) in einem sed-Befehl durch "string" zu ersetzen:
echo input | sed "s/$/ string/g"
Warum bevorzuge ich das erstere? Weil es eine Zeichenfolge sofort mit stdin verkettet, 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
Wenn Sie dagegen "sed" verwenden, wird zuerst der gesamte Inhalt der Klammer ausgeführt und dann "sed", also der Befehl
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
gibt beide Zeilen aus
input_one string
input_two string
nach 5 Sekunden.
Dies kann sehr nützlich sein, wenn Sie Funktionen aufrufen, deren Ausführung lange dauert und die über die Ausgabe der Funktion kontinuierlich aktualisiert werden sollen.
Ich weiß, dass dies einige Jahre zu spät ist, aber Sie können dies mit der Option xargs -J erreichen:
echo "input" | xargs -J "%" echo "%" "string"
Und da es sich um xargs handelt, können Sie dies in mehreren Zeilen einer Datei gleichzeitig tun. Wenn die Dateinamen drei Zeilen haben, wie zum Beispiel:
Adam
Bob
Charlie
Du könntest es tun:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
-J
scheint aber nicht Standard / üblich zu sein. Unter Linux (wo xargs
ist ein Teil davon GNU findutils
) erhalte ich die Fehlermeldung: Auf xargs: invalid option -- 'J'
welchem System ist das?
-J
ist für die Mac-Version. Für Linux -I
führt die gleiche Funktion aus.
cat names | xargs -I% echo "I like % because he is nice"
IOW: Keine Notwendigkeit für -n 1
( xargs
Aufrufe echo
einmal pro Eingabezeile, da -I
impliziert -L1
). Außerdem scheinen alle separaten Arg-Anführungszeichen redundant zu sein.
Der Befehl, den Sie veröffentlicht haben, verwendet die Zeichenfolge "input" und verwendet sie als stdin-Stream von COMMAND. Dies würde nur dann zu den gewünschten Ergebnissen führen, wenn COMMAND zuerst den Inhalt seines stdin und dann seine Befehlszeilenargumente ausgedruckt hat.
Es scheint, als ob das, was Sie tun möchten, der Befehlsersetzung näher kommt.
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
Mit der Befehlsersetzung können Sie eine Befehlszeile wie folgt haben:
echo input `COMMAND "string"`
Dies wertet zuerst COMMAND mit "string" als Eingabe aus und erweitert dann die Ergebnisse dieser Befehlsausführung auf eine Zeile, wobei ersetzt wird, was zwischen den '`' Zeichen steht.
echo input $(COMMAND "string")
anstelle von Backticks. Viel Glück für jeden.
pbpaste | awk '{print "http://dx.doi.org/"$1}'
und bekommehttp://dx.doi.org/10.1098/rsif.2012.0125