GNU/Linux >> Tutoriales Linux >  >> Linux

Seleccionar/deseleccionar líneas manualmente antes de reenviar a stdout

Aunque me gusta el vipe enfoque, he encontrado una forma aún más genial:fzf.

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

... ofrece una buena lista en la que puedo buscar y alternar los elementos con el teclado y desaparece por completo cuando termino.


moreutils tiene vipe , que solo ejecuta su editor de texto normal (vi o algo así) como parte de la canalización. Cualquier línea que no elimine se volverá a escribir en la salida estándar. (En general, sin embargo, se obtiene el mismo resultado al redirigir a un archivo temporal y editar ese archivo).


También puedes usar gvim (y vim ) para esto. Insertar gvim /dev/stdin en tu pipe, y escribe haciendo :wq! /dev/stdout cuando termines de editar.

Llamar a gvim de la siguiente manera le permite escribir y cerrar de forma más natural con ZZ :

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

Puedes hacer un alias o una función de eso:

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

Aquí hay un ejemplo donde eliminé las líneas 4-7 y terminé haciendo ZZ en modo normal:

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

EDITAR:vim regular es un poco más complicado, porque usa stdin para la entrada del teclado y stdout para dibujar la interfaz de usuario. Sin embargo, aún puede usarlo agregando un proceso adicional. Usted redirige el std* de vim a la terminal y usa el std* del proceso principal para la canalización de datos.

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

El archivo temporal es necesario porque, de lo contrario, la salida de la canalización se mezclará con la interfaz de usuario de vim y podría desaparecer con ella cuando salga de vim.


Linux
  1. Cat ¿Línea X a Línea Y en un archivo enorme?

  2. ¿Seleccionar líneas del archivo de texto que tienen identificadores enumerados en otro archivo?

  3. Awk de diferentes líneas?

  4. Comando wc de linux

  5. ¿Cómo seleccionar varias líneas de un archivo o de una tubería en un script?

Pegar comando en Linux (combinar líneas)

Cómo redirigir stderr a stdout en Bash

Cómo mezclar líneas en un archivo en Linux

Cómo invertir líneas en un archivo por caracteres en Linux

5 formas de contar el número de líneas en un archivo

Cómo encontrar las líneas más largas en un archivo en Linux