GNU/Linux >> Linux Esercitazione >  >> Linux

Selezionare/deselezionare manualmente le righe prima dell'inoltro a stdout

Mentre mi piace il vipe approccio, ho trovato un modo ancora più interessante:fzf.

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

...fornisce un bel elenco in cui posso cercare e alternare gli elementi con la tastiera e scompare completamente quando ho finito.


moreutils ha vipe , che esegue semplicemente il normale editor di testo (vi o qualcosa del genere) come parte della pipeline. Tutte le righe che non elimini verranno riscritte nello stdout. (In generale, però, ottieni lo stesso risultato reindirizzando a un file temporaneo e modificando quel file.)


Puoi anche usare gvim (e vim ) per questo. Inserisci gvim /dev/stdin nella pipe e scrivi facendo :wq! /dev/stdout quando hai finito di modificare.

Chiamare gvim come segue ti consente di scrivere e chiudere in modo più naturale con ZZ :

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

Puoi crearne un alias o una funzione:

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

Ecco un esempio in cui ho cancellato le righe 4-7 e finito facendo ZZ in modalità normale:

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

EDIT:Vim regolare è un po' più complicato, perché utilizza stdin per l'input da tastiera e stdout per disegnare l'interfaccia utente. Tuttavia, puoi ancora usarlo aggiungendo un processo aggiuntivo. Reindirizza lo std* di vim al terminale e usi lo std* del processo padre per la pipe di dati.

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"
  '
}

Il file temporaneo è necessario perché altrimenti l'output della pipe verrà mescolato con l'interfaccia utente di vim e potrebbe scomparire con essa quando vim esce.


Linux
  1. Come reindirizzare l'output su un file e Stdout in Linux

  2. Cat Line X to Line Y su un file enorme?

  3. Seleziona le righe dal file di testo che hanno gli ID elencati in un altro file?

  4. Log rotazione di stdout?

  5. Modificare l'ordine delle righe in un file

Incolla comando in Linux (Unisci righe)

Come reindirizzare stderr a stdout in Bash

Come mescolare le linee in un file in Linux

Come invertire le righe in un file in base al carattere in Linux

5 modi per contare il numero di righe in un file

Come trovare le righe più lunghe in un file in Linux