Wie verkette ich stdin mit einem String wie diesem?
echo "input" | COMMAND "string"
und bekomme
inputstring
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"
pbpaste | awk '{print "http://dx.doi.org/"$1}'
und bekommehttp://dx.doi.org/10.1098/rsif.2012.0125
'{print $0"string"}'
, um die ganze Sache zu schnappen.string
an jede Zeile angehängt . Versuchen Sie esecho '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 wegzuwerfenWarum lassen Sie die Pipe jedoch nicht fallen und greifen bei einer Befehlsersetzung auf die Ausgabe der linken Seite zu:
quelle
Ich benutze oft Pipes, daher ist dies eine einfache Möglichkeit, stdin voranzustellen und zu ergänzen:
quelle
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:
In Ihrem Beispiel:
quelle
Es gibt einige Möglichkeiten, dies zu erreichen. Ich persönlich denke, das Beste ist:
Eine andere Möglichkeit besteht darin, "$" (Zeilenendezeichen) in einem sed-Befehl durch "string" zu ersetzen:
Warum bevorzuge ich das erstere? Weil es eine Zeichenfolge sofort mit stdin verkettet, zum Beispiel mit dem folgenden Befehl:
Sie erhalten sofort die erste Ausgabe:
und dann nach 5 Sekunden erhalten Sie das andere Echo:
Wenn Sie dagegen "sed" verwenden, wird zuerst der gesamte Inhalt der Klammer ausgeführt und dann "sed", also der Befehl
gibt beide Zeilen aus
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.
quelle
Ich weiß, dass dies einige Jahre zu spät ist, aber Sie können dies mit der Option xargs -J erreichen:
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:
Du könntest es tun:
quelle
-J
scheint aber nicht Standard / üblich zu sein. Unter Linux (woxargs
ist ein Teil davonGNU findutils
) erhalte ich die Fehlermeldung: Aufxargs: 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
Aufrufeecho
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:
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.
quelle
echo input $(COMMAND "string")
anstelle von Backticks. Viel Glück für jeden.Katze wird meine Wahl sein:
ls | cat - <(echo new line)
quelle
Funktioniert auch:
Erzeugt Zeichenfolgen wie:
...
quelle