Frage Wie stdin und eine Zeichenkette verketten?


Wie verkette ich stdin an eine Zeichenkette, so?

echo "input" | COMMAND "string"

und bekomme

inputstring

76
2017-12-14 18:12


Ursprung


Antworten:


Ein bisschen hacky, aber das könnte der kürzeste Weg sein, um das zu tun, was du in der Frage gestellt hast (benutze eine Pipe, um sie zu akzeptieren) stdout von echo "input" wie stdin zu einem anderen Prozess / Befehl:

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

Ausgabe:

inputstring

Welche Aufgabe versuchen Sie gerade zu erfüllen? Mehr Kontext kann Ihnen mehr Richtung auf eine bessere Lösung bringen.

Update - Antwort auf Kommentar:

@NoamRoss

Die idiomatische Art zu tun, was Sie wollen, ist dann:

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

Das $(...) Syntax wird aufgerufen Befehlsersetzung. Kurz gesagt, es führt die Befehle aus, die in einer neuen Subshell enthalten sind, und ersetzt das Sein stdout Ausgabe an, wo der $(...) wurde in der Parent-Shell aufgerufen. So würdest du in der Tat bekommen:

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

82
2017-12-14 18:24



benutzen cat - von stdin lesen und hineinlegen $() die nachlaufende Zeilenschaltung wegwerfen

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

Aber warum lässt du die Pipe nicht fallen und nimmst die Ausgabe der linken Seite in einer Befehlsersetzung:

COMMAND "$(echo input)string"

39
2017-12-14 20:51



Ich benutze oft Pipes, daher ist dies eine einfache Möglichkeit, stdin vorzuspeichern und zu suffixieren:

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

21
2017-10-15 03:04



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/'

9
2018-02-15 08:29



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, in einem sed-Befehl "$" (Zeilenende-Zeichen) durch "string" zu ersetzen:

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

Warum bevorzuge ich das ehemalige? Weil es einen String 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 bekommst du das andere Echo:

input_two string

Auf der anderen Seite mit "sed" zuerst führt es den gesamten Inhalt der Klammer und dann gibt es es an "sed", so 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 Aufrufe von Funktionen ausführen, deren Ausführung sehr lange dauert und die kontinuierlich über die Ausgabe der Funktion aktualisiert werden sollen.


8
2017-12-05 12:05



Ich weiß, das ist ein paar Jahre zu spät, aber Sie können dies mit der Option xargs -J erreichen:

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

Und seit es ist Xargs, können Sie dies in mehreren Zeilen einer Datei gleichzeitig tun. Wenn die Datei 'names' drei Zeilen hat, wie:

Adam
Bob
Charlie

Du könntest es tun:

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

4
2017-09-29 15:50



Der von Ihnen gepostete Befehl würde den String "input" nehmen und ihn als stdin-Datenstrom von COMMAND verwenden, der die gesuchten Ergebnisse nicht liefern würde, wenn COMMAND nicht zuerst den Inhalt seiner stdin ausgibt und dann seine Befehlszeilenargumente ausgibt.

Es scheint so, als ob das, was Sie tun möchten, der Befehlsersetzung näher ist.

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

Mit Befehlsersetzung können Sie eine Befehlszeile wie folgt haben:

echo input `COMMAND "string"`

Dies wird COMMAND zuerst mit "string" als Eingabe auswerten und dann die Ergebnisse dieser Befehlsausführung auf eine Zeile erweitern und dabei ersetzen, was zwischen den Zeichen steht.


3
2017-12-14 18:23



Funktioniert auch:

seq -w 0 100 | xargs -I {} echo "string "{}

Generiert Strings wie:

string 000
string 001
string 002
string 003
string 004

...


0
2018-04-01 18:31