Bagaimana cara menggabungkan stdin ke string, seperti ini?
echo "input" | COMMAND "string"
dan dapatkan
inputstring
Agak hacky, tetapi ini mungkin cara terpendek untuk melakukan apa yang Anda tanyakan dalam pertanyaan (gunakan pipa untuk menerima stdout
dari echo "input"
sebagai stdin
ke proses / perintah lain:
echo "input" | awk '{print $1"string"}'
Keluaran:
inputstring
Tugas apa yang sebenarnya Anda coba selesaikan? Lebih banyak konteks dapat memberi Anda lebih banyak arahan tentang solusi yang lebih baik.
Perbarui - menanggapi komentar:
@Bayu_joo
Cara yang lebih idiomatis untuk melakukan apa yang Anda inginkan adalah:
echo 'http://dx.doi.org/'"$(pbpaste)"
The $(...)
sintaks disebut perintah substitusi . Singkatnya, ia mengeksekusi perintah yang diapit dalam subkulit baru, dan mengganti stdout
outputnya ke tempat $(...)
dipanggil di shell induk. Jadi Anda akan mendapatkan, pada dasarnya:
echo 'http://dx.doi.org/'"rsif.2012.0125"
pbpaste | awk '{print "http://dx.doi.org/"$1}'
dan dapatkanhttp://dx.doi.org/10.1098/rsif.2012.0125
'{print $0"string"}'
untuk mengambil semuanya.string
ke setiap baris. Cobaecho 'input'\n'another line' | awk '{print $0"string"}'
.gunakan
cat -
untuk membaca dari stdin, dan masukkan$()
ke dalam untuk membuang baris baru yang tertinggalNamun mengapa Anda tidak menjatuhkan pipa dan mengambil output dari sisi kiri dalam substitusi perintah:
sumber
Saya sering menggunakan pipa, jadi ini cenderung menjadi cara mudah untuk memberi awalan dan akhiran stdin:
sumber
pipe
dancat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"
:? Atau, versi yang lebih mudah dibaca:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
Anda dapat melakukannya dengan sed:
Dalam contoh Anda:
sumber
Ada beberapa cara untuk melakukannya, menurut saya yang terbaik adalah:
Lain dapat dengan mengganti "$" (karakter akhir baris) dengan "string" dalam perintah sed:
Mengapa saya lebih memilih yang pertama? Karena itu menggabungkan string ke stdin secara instan, misalnya dengan perintah berikut:
Anda segera mendapatkan hasil pertama:
dan kemudian setelah 5 detik Anda mendapatkan gema lainnya:
Di sisi lain, menggunakan "sed" terlebih dahulu melakukan semua konten tanda kurung dan kemudian memberikannya ke "sed", jadi perintah
akan menampilkan kedua baris
setelah 5 detik.
Ini bisa sangat berguna jika Anda melakukan panggilan ke fungsi yang membutuhkan waktu lama untuk menyelesaikannya dan ingin terus diperbarui tentang keluaran fungsi.
sumber
Saya tahu ini terlambat beberapa tahun, tetapi Anda dapat melakukannya dengan opsi xargs -J:
Dan karena ini adalah xargs, Anda dapat melakukan ini pada beberapa baris file sekaligus. Jika file 'names' memiliki tiga baris, seperti:
Anda bisa melakukan:
sumber
-J
sepertinya tidak standar / umum. Di Linux (di manaxargs
bagiannyaGNU findutils
) saya mendapatkan error: Dixargs: invalid option -- 'J'
sistem mana ini?-J
adalah untuk versi Mac. Untuk Linux-I
melakukan fungsi yang sama.cat names | xargs -I% echo "I like % because he is nice"
IOW: tidak perlu untuk-n 1
(xargs
panggilanecho
sekali per baris masukan, karena-I
menyiratkan-L1
) Juga, semua kutipan arg terpisah, tampaknya berlebihan.Perintah yang Anda kirimkan akan mengambil string "input" menggunakannya sebagai aliran stdin COMMAND, yang tidak akan menghasilkan hasil yang Anda cari kecuali COMMAND pertama kali mencetak konten stdin dan kemudian mencetak argumen baris perintahnya.
Sepertinya yang ingin Anda lakukan lebih dekat dengan penggantian perintah.
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
Dengan substitusi perintah Anda dapat memiliki baris perintah seperti ini:
Ini pertama-tama akan mengevaluasi COMMAND dengan "string" sebagai input, dan kemudian memperluas hasil eksekusi perintah tersebut ke dalam baris, menggantikan apa yang ada di antara karakter '`'.
sumber
echo input $(COMMAND "string")
, daripada backticks. Semoga beruntung untuk semuanya.kucing akan menjadi pilihan saya:
ls | cat - <(echo new line)
sumber
Juga bekerja:
Akan menghasilkan string seperti:
...
sumber