GNU/Linux >> Belajar Linux >  >> Linux

Pilih/batalkan pilihan baris secara manual sebelum meneruskan ke stdout

Sementara saya suka vipe pendekatan, saya telah menemukan cara yang lebih keren:fzf.

cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk" | fzf -m | cat

... memberikan daftar yang bagus di mana saya dapat mencari dan mengganti item dengan keyboard dan menghilang sepenuhnya setelah saya selesai.


moreutils memiliki vipe , yang hanya menjalankan editor teks biasa Anda (vi atau sesuatu) sebagai bagian dari pipa. Setiap baris yang tidak Anda hapus akan ditulis kembali ke stdout. (Namun secara umum, Anda mendapatkan hasil yang sama dengan mengalihkan ke file sementara dan mengedit file tersebut.)


Anda juga dapat menggunakan gvim (dan vim ) untuk ini. Masukkan gvim /dev/stdin ke dalam pipa Anda, dan tulis dengan melakukan :wq! /dev/stdout setelah Anda selesai mengedit.

Memanggil gvim sebagai berikut memungkinkan Anda menulis dan menutup dengan lebih alami dengan ZZ :

gvim +'nmap ZZ :wq!<cr> | r /dev/stdin | 1d | file /dev/stdout'

Anda dapat membuat alias atau fungsi dari itu:

gvimp() {
  gvim +'
    nmap ZZ :wq!<cr>
    r /dev/stdin
    1d
    file /dev/stdout
  '
}

Berikut adalah contoh dimana saya menghapus baris 4-7 dan selesai dengan melakukan ZZ dalam mode normal:

$ seq 1 10 | gvimp | sed -r 's/^|$/=/g'
=1=
=2=
=3=
=8=
=9=
=10=

EDIT:Vim reguler sedikit lebih rumit, karena menggunakan stdin untuk input keyboard dan stdout untuk menggambar antarmuka pengguna. Namun, Anda masih dapat menggunakannya dengan menambahkan proses tambahan. Anda mengalihkan std* vim ke terminal, dan menggunakan std* proses induk untuk pipa data.

vimp() {
  bash -c '
    terminal="/dev/$(ps -o tty= $$)"
    tmp_out="$(mktemp)"
    trap "rm \$tmp_out" EXIT
    vim <(cat) < "$terminal" &> "$terminal" +"
      file $tmp_out
      set noreadonly
      nmap ZZ :wq!<cr>
    "
    cat "$tmp_out"
  '
}

File sementara diperlukan karena jika tidak, keluaran pipa akan tercampur dengan antarmuka pengguna vim dan mungkin hilang bersamanya saat vim keluar.


Linux
  1. Perintah Untuk Mengeluarkan Konten File Ke Stdout?

  2. Awk Dari Baris Yang Berbeda?

  3. Rotasi log stdout?

  1. Cat Line X Ke Line Y Pada File Besar?

  2. Pilih Baris Dari File Teks Yang Memiliki Id Terdaftar Di File Lain?

  3. Mengubah urutan baris dalam file

  1. Hitung Baris Dalam File?

  2. Perintah wc Linux

  3. Hitung baris dalam file besar