Odpowiedzi:
Trochę hacky, ale może to być najkrótszy sposób na zrobienie tego, o co pytałeś w pytaniu (użyj potoku, aby zaakceptować stdout
od echo "input"
jako stdin
do innego procesu / polecenia:
echo "input" | awk '{print $1"string"}'
Wynik:
inputstring
Jakie zadanie dokładnie próbujesz wykonać? Więcej kontekstu może dać ci więcej wskazówek co do lepszego rozwiązania.
Aktualizacja - odpowiadanie na komentarz:
@NoamRoss
Bardziej idiomatyczny sposób robienia tego, co chcesz, to:
echo 'http://dx.doi.org/'"$(pbpaste)"
$(...)
Składni nazywa zastąpienie polecenia . Krótko mówiąc, wykonuje polecenia zawarte w nowej podpowłoce i zastępuje swoje stdout
dane wyjściowe miejscem, w którym $(...)
została wywołana w powłoce nadrzędnej. W efekcie otrzymujesz:
echo 'http://dx.doi.org/'"rsif.2012.0125"
'{print $0"string"}'
do złapania całości.
string
do każdej linii. Spróbuj echo 'input'\n'another line' | awk '{print $0"string"}'
.
użyj cat -
do czytania ze standardowego wejścia i wstaw go, $()
aby pozbyć się końcowego znaku nowej linii
echo input | COMMAND "$(cat -)string"
Jednak dlaczego nie upuścisz potoku i nie złapiesz wyjścia z lewej strony w zamianie poleceń:
COMMAND "$(echo input)string"
Często używam potoków, więc zwykle jest to łatwy sposób na prefiks i sufiks stdin:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
pipe
icat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"
:? Lub bardziej czytelna wersja:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
Możesz to zrobić za pomocą seda:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
W twoim przykładzie:
echo input | sed 's/.*/\0string/'
Jest na to kilka sposobów, osobiście uważam, że najlepszym jest:
echo input | while read line; do echo $line string; done
Innym sposobem może być zastąpienie „$” (znak końca wiersza) ciągiem w poleceniu sed:
echo input | sed "s/$/ string/g"
Dlaczego wolę to pierwsze? Ponieważ natychmiast łączy ciąg na stdin, na przykład za pomocą następującego polecenia:
(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done
natychmiast otrzymasz pierwszy wynik:
input_one string
a następnie po 5 sekundach pojawi się drugie echo:
input_two string
Z drugiej strony, używając „sed” najpierw wykonuje całą zawartość nawiasu, a następnie przekazuje ją „sed”, więc polecenie
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
wyświetli obie linie
input_one string
input_two string
po 5 sekundach.
Może to być bardzo przydatne w przypadkach, gdy wykonujesz wywołania funkcji, których wykonanie zajmuje dużo czasu i chcesz być na bieżąco aktualizowany o wynikach funkcji.
Wiem, że to opóźnienie o kilka lat, ale możesz to osiągnąć za pomocą opcji xargs -J:
echo "input" | xargs -J "%" echo "%" "string"
A ponieważ jest to xargs, możesz to zrobić w wielu wierszach pliku jednocześnie. Jeśli plik „names” ma trzy linie, na przykład:
Adam
Bob
Charlie
Mógłbyś:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
-J
że nie wydaje się być standardowy / powszechny. W systemie Linux (gdzie xargs
jest część GNU findutils
) pojawia się błąd: w xargs: invalid option -- 'J'
którym systemie to działa?
-J
dotyczy wersji na komputery Mac. W przypadku Linuksa -I
pełni tę samą funkcję.
cat names | xargs -I% echo "I like % because he is nice"
IOW: nie ma potrzeby -n 1
( xargs
wywołania echo
raz na wiersz wejścia i tak, ponieważ -I
implikuje -L1
). Ponadto, wszystkie oddzielne cytowania argumentów wydają się zbędne.
Polecenie, które wysłałeś, użyłoby łańcucha „input” jako strumienia wejścia standardowego COMMAND, co nie dałoby wyników, których szukasz, chyba że COMMAND najpierw wydrukowałby zawartość swojego wejścia standardowego, a następnie wypisał argumenty wiersza poleceń.
Wygląda na to, że to, co chcesz zrobić, jest bardziej zbliżone do zastępowania poleceń.
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
Dzięki podstawianiu poleceń możesz mieć taką linię poleceń:
echo input `COMMAND "string"`
Spowoduje to najpierw oszacowanie polecenia COMMAND z "ciągiem" jako danymi wejściowymi, a następnie rozszerzenie wyników wykonania tego polecenia na wiersz, zastępując to, co znajduje się między znakami '`'.
echo input $(COMMAND "string")
, a nie odwrotnych apostrofów. Powodzenia wszystkim.
pbpaste | awk '{print "http://dx.doi.org/"$1}'
i otrzymujęhttp://dx.doi.org/10.1098/rsif.2012.0125