Melakukan dua hal dengan output dari sebuah perintah

9

Saya memiliki program texcountyang menampilkan jumlah kata dalam dokumen LaTeX saya. Saya juga dapat mem-pipe output ini untuk sedmembuat baris baru TeX linebreaks dan menulis ini ke file yang kemudian dapat saya sertakan dalam dokumen terakhir saya. Tetapi ketika saya melakukan texcount foo.tex | sed s/$/'\\\\'/ > wc.texoutput perintah baris texcountditekan.

Bagaimana saya bisa mendapatkan output dari perintah pertama yang akan ditampilkan di terminal dan disalurkan ke sed?

Seamus
sumber

Jawaban:

9

Anda dapat menggunakan pipa anonim untuk perintah kedua:

texcount foo.tex | tee >(sed s/$/'\\\\'/ > wc.tex)
mengibaskan
sumber
Bagian penting dari jawaban ini adalah menggunakan tee. Jika Anda memiliki cangkang tertentu seperti Bash, Anda dapat menyalurkan output tee menggunakan >(some further commands). Di shell lain, Anda harus memberikan tee argumen nama file (ini adalah mode operasi standarnya), kemudian jalankan some further commands < thatfile, dan kemudian hapus file itu. Atau lihat jawaban Hari di bawah ini.
dubiousjim
tee, tee & tee.
bagavadhar
7

Anda memerlukan perintah "tee", yang memungkinkan Anda untuk membagi pipa.

texcount foo.tex | tee >output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt

Ini akan meninggalkan Anda file output.txt tambahan. Baca ini untuk info lebih lanjut: http://www.unixtutorial.org/2007/12/tee-replicate-standard-output/ Anda juga dapat melakukan "man tee".

Danny Staple
sumber
texcount foo.tex | tee unmodified |sed s/$/'\\\\'/ > modifiedmenempatkan versi output yang dimodifikasi dan tidak dimodifikasi dalam dua file. Bagaimana cara mencetak versi yang tidak dimodifikasi ke terminal? Saya mencoba tee stdouttetapi tidak mencetak apa-apa ...
Seamus
3
Anda tidak dapat melakukan itu, karena tee mengirimkan inputnya ke stdout dan file. Stdout inilah yang menjadi input bagi sed. Anda bisa menambahkan && cat unmodifieddi bagian akhir. Itu akan membuang output yang tidak dimodifikasi ke terminal.
KeithB
Baris perintah yang tepat di sini adalah texcount foo.tex | tee output.txt | sed s/$/'\\\\'/ > wc.tex ; cat output.txt. Atau Anda bisa menggunakannya texcount foo.tex | tee output.txt; sed s/$/'\\\\'/ output.txt > wc.tex. Dalam kedua kasus itu, Anda mungkin ingin melakukannya rm output.txtsesudahnya.
dubiousjim
@dubiousjim Titik koma itu benar - pipa bekerja, tetapi titik koma lebih baik mengungkapkan apa yang dimaksudkan.
Danny Staple
6

Anda bisa menggunakan yang terbilang idiom

texcount foo.tex | tee /dev/tty | sed s/$/'\\\\'/ > wc.tex

/dev/tty adalah perangkat ajaib yang mengacu pada terminal pengontrol dari proses saat ini.

Hari
sumber