Perintah perpipaan, modifikasi stdin write ke stdout

8
echo Hello World | nano - | less

Saya ingin memodifikasi Hello -> Selamat tinggal di editor teks.

Tidak harus dengan nano. Saya terjebak dengan nano membaca stdin tetapi mengharuskan saya untuk menulis ke file (menulis ke - membuat file bernama -)

pengguna65660
sumber
ss @, saya pikir lebih masuk akal untuk menutup Q lain sebagai duplikat dari ini karena ini adalah kasus yang lebih luas.
Graeme
@ Greme - Saya akan cenderung setuju dengan Anda, tetapi yang lain juga memiliki jawaban Anda, meskipun tidak ditulis dengan baik. Beberapa penggabungan mungkin lebih tepat. Mungkin kita harus meminta bantuan mod untuk membantu mereka? Saya akan ping satu tentang itu.
slm
@slm, saya pikir kita bisa menyerahkannya kepada siapa pun yang melewati antrian dekat dan membiarkan orang banyak memutuskan. Perbedaan utama seperti yang saya lihat adalah bahwa Q yang lain adalah kasus khusus di mana Anda hanya ingin satu ujung pipa.
Graeme
1
@Graeme - jika kita tidak memasang pompa di atasnya maka ppl kemungkinan akan menutup yang lebih baru ke yang lebih lama sebagai dup.
slm

Jawaban:

11

The MoreUtils paket memiliki perintah yang besar untuk melakukan hal ini, disebut vipe. Dari halaman manual:

SYNOPSIS
       command1 | vipe | command2

DESCRIPTION
       vipe allows you to run your editor in the middle of a unix pipeline and
       edit the data that is being piped between programs. Your editor will have
       the full data being piped from command1 loaded into it, and when you close
       it, that data will be piped into command2.

Secara default ini akan menggunakan editorperintah, yang biasanya hanya symlink ke editor baris perintah default. Anda dapat mengubahnya dengan mengubah tautan (digunakan update-alternativespada sistem berbasis Debian) atau menggunakan EDITORvariabel lingkungan. Misalnya, Anda bisa melakukan:

echo Hello World | EDITOR=nano vipe | less

Kalau tidak, jika editor teks tertentu tidak memiliki dukungan untuk hal semacam ini, saya pikir Anda terjebak dengan secara manual membuat file sementara, menulis file itu, menjalankan editor, memasukkan file ke seluruh pipa dan menghapus file sementara. The vipeperintah pada dasarnya mengurus semua ini. Ini bagus, tetapi perintahnya jarang tersedia secara default.

Graeme
sumber
1

Editor teks joe (alias Editor Sendiri Joe ) melakukan apa yang Anda inginkan.

Perintah ini echo "hello world" | joe - | lessberfungsi seperti yang diharapkan, meskipun perlu tanda kutip untuk beberapa alasan.

Beberapa perintah (seperti gpg) menghasilkan output yang ditampilkan yang tidak memasuki pipa. Ini merusak tampilan awal di dalam joe, tetapi menekan ctrl + r - refresh - akan membersihkan semuanya.

Ben Tesch
sumber
1

Jika yang Anda inginkan adalah mengganti "Halo" dengan "Selamat tinggal" (atau penggantian kata lain), Anda dapat menghindari pengeditan manual dalam editor demi alat pencarian & penggantian otomatis. Misalnya "sed" dapat melakukan penggantian seperti ini:

echo Hello World | sed 's/Hello/Goodbye/' | less

Periksa "man sed" untuk lebih jelasnya.

ElazarR
sumber