Jak połączyć stdin z ciągiem takim jak ten?Jak połączyć stdin i string?
echo "input" | COMMAND "string"
i dostać
inputstring
Jak połączyć stdin z ciągiem takim jak ten?Jak połączyć stdin i string?
echo "input" | COMMAND "string"
i dostać
inputstring
Trochę hacky, ale to może być najkrótsza droga do tego, co pytasz w pytaniu (użyć rury przyjąć stdout
z echo "input"
jak stdin
do innego procesu/polecenia:
echo "input" | awk '{print $1"string"}'
wyjściowa:
inputstring
Jakie zadania są dokładnie chce osiągnąć? Więcej kontekst może Ci więcej na kierunku lepszego rozwiązania.
Update - odpowiadając na komentarz:
@NoamRoss
Im bardziej idiomatycznych sposób robienia tego, co chcesz, to wówczas:
echo 'http://dx.doi.org/'"$(pbpaste)"
Składnia $(...)
nazywa command substitution. W skrócie, wykonuje polecenia zawarte w nowej podpowłoce i zastępuje jego wyjście stdout
miejscem, w którym $(...)
zostało wywołane w powłoce macierzystej.Więc co można uzyskać w efekcie:
echo 'http://dx.doi.org/'"rsif.2012.0125"
Komenda ty pisał zajęłoby ciąg „Input” używać go jako stdin strumienia komendę, która nie przyniosą oczekiwanych rezultatów, którego szukasz, chyba że polecenie pierwszy wydrukowany zawartość jego stdin, a następnie wydrukowane jego 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
Z podstawienia polecenia można mieć wiersza poleceń tak:
echo input `COMMAND "string"`
To będzie pierwszy ocenić polecenie z „string” jako wejście, a następnie rozwiń wyniki, które nakazuje wykonanie na kolumnę linii, zastępując to, co jest pomiędzy znakami "."
i oczywiście @NaomRoss, chyba że wymagane do korzystania z Bourne shell lub mają inne crazy „przenoszenia” mandaty, będziesz korzystać z nowoczesnego podstawienia polecenia jak 'wejściowego echo $ (polecenie„string”) ', zamiast odgłosów. Powodzenia wszystkim. – shellter
użytku cat -
czytać ze standardowego wejścia, i umieścić go w $()
wyrzucić przełamane spływu
echo input | COMMAND "$(cat -)string"
Jednak dlaczego nie upuścić i rury chwycić wyjście z lewej strony w taktycznej polecenia:
COMMAND "$(echo input)string"
Oto praktyczny przykład: znajdź ~/other_program/lib -name "* .jar" | tr '\ n' ':' | echo "$ (cat -) ~/java_app/classes" –
To działa dla mnie w bashu, ale w zsh pojawia się "cat: -: Input/output error". Jakiś pomysł, co może to spowodować? – jaymmer
można to zrobić z sed:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
W przykładzie:
echo input | sed 's/.*/\0string/'
Istnieje kilka sposobów osiągnięcia tego, osobiście uważam, najlepiej jest:
echo input | while read line; do echo $line string; done
Innym może być przez podstawienie „$” (koniec linii znak) z "ciągiem" w poleceniu sed:
echo input | sed "s/$/ string/g"
Dlaczego preferuję ten pierwszy? Ponieważ skleja ciąg do stdin natychmiast, 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
masz natychmiast pierwsze wyjście:
input_one string
a następnie po 5 sekundach można dostać drugą echo:
input_two string
Z drugiej strony, używając "sed" najpierw wykonuje całą treść nawiasów, a następnie daje ją "sed", więc polecenie
(echo input_one ;sleep 5; echo input_two) | sed "s/$/ string/g"
wyjście obydwie linie
input_one string
input_two string
po 5 sekundach.
Może to być bardzo przydatne w przypadkach, gdy wykonywane są połączenia z funkcjami, których wykonanie zajmuje dużo czasu i które wymagają ciągłej aktualizacji na temat wyjścia tej funkcji.
W rzeczywistości opcja _sed_ przetwarza również natychmiast każdą linię wejścia. – tomekwi
wiem, że to kilka lat spóźnione, ale można tego dokonać z xargs -J opcji:
echo "input" | xargs -J "%" echo "%" "string"
A ponieważ jest xargs, można to zrobić na wielu liniach pliku natychmiast.Jeśli „nazwy” plik ma trzy linie, takie jak:
Adam
Bob
Charlie
Można zrobić:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
Wygląda fajnie, z wyjątkiem '-J' nie wydaje się być standardowe/wspólne. W systemie Linux (gdzie 'xargs' jest częścią' GNU findutils') pojawia się błąd: 'xargs: niepoprawna opcja - 'J''' Który system jest włączony? – arielf
'-J' jest dla wersji Mac. Dla Linux '-I' wykonuje tę samą funkcję. – user2635263
Dzięki! bardzo przydatne. Zwróć uwagę, że w systemie Linux ta uproszczona wersja działa równie dobrze: 'cat names | xargs -I% echo "Lubię%, ponieważ jest miły" 'IOW: nie ma potrzeby użycia' -n 1' ('xargs' wywołuje' echo' raz w każdym wierszu wejścia, ponieważ '-I' zawiera' -L1 ') Także wszystkie oddzielne cytowania arg wydaje się być zbędne. – arielf
Jestem często za pomocą rur, więc to wydaje się być łatwym sposobem prefiks i sufiks stdin :
echo "my standard in" | cat <(echo "prefix... ") <(cat -) <(echo " ...suffix")
prefix... my standard in ...suffix
Dzięki! To naprawdę bardzo fajny przykład użycia 'pipe' i' cat' –
To powinno być najlepszą odpowiedzią –
Dlaczego nie tylko: "echo" mój standard w "| echo -e "prefiks \ n $ (cat -) \ n" "? Lub, bardziej czytelna wersja: 'echo" mój standard w "| printf "% s \ n% s \ n% s \ n" "prefiks" "$ (cat -)" "sufiks" ' – MiniMax
Dzięki! Działa to świetnie. Dokładne zadanie, które próbuję wykonać, polega na pobraniu ciągu znaków ze schowka (DOI) i dodaniu do niego adresu URL, więc robię to za pomocą 'pbpaste | awk "{print" http://dx.doi.org/ "$ 1}" i uzyskaj 'http: // dx.doi.org/10.1098/rsif.2012.0125' –
@NoamRoss zaktualizowana odpowiedź; seem edit;) –
@ sampson-chen, użyłbym ''{print $ 0" string "}", aby pobrać całą rzecz. –