GNU/Linux >> Tutoriels Linux >  >> Linux

Sélectionner/désélectionner manuellement les lignes avant de les transférer vers stdout

Alors que j'aime bien le vipe approche, j'ai trouvé un moyen encore plus cool :fzf.

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

... donne une belle liste dans laquelle je peux rechercher et basculer les éléments avec le clavier et disparaît complètement lorsque j'ai terminé.


moreutils a vipe , qui exécute simplement votre éditeur de texte habituel (vi ou quelque chose) dans le cadre du pipeline. Toutes les lignes que vous ne supprimez pas seront réécrites dans stdout. (En général, cependant, vous obtenez le même résultat en redirigeant vers un fichier temporaire et en modifiant ce fichier.)


Vous pouvez également utiliser gvim (et vim ) pour ça. Insérez gvim /dev/stdin dans votre pipe, et écrivez en faisant :wq! /dev/stdout lorsque vous avez terminé l'édition.

Appeler gvim comme suit vous permet d'écrire et de fermer plus naturellement avec ZZ :

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

Vous pouvez en faire un alias ou une fonction :

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

Voici un exemple où j'ai supprimé les lignes 4 à 7 et terminé en faisant ZZ en mode normal :

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

EDIT :Vim régulier est un peu plus délicat, car il utilise stdin pour la saisie au clavier et stdout pour dessiner l'interface utilisateur. Cependant, vous pouvez toujours l'utiliser en ajoutant un processus supplémentaire. Vous redirigez le std* de vim vers le terminal et utilisez le std* du processus parent pour le canal de données.

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

Le fichier temporaire est nécessaire car sinon la sortie du tube sera mélangée avec l'interface utilisateur de vim et pourrait disparaître avec elle à la sortie de vim.


Linux
  1. Awk de différentes lignes ?

  2. Compter les lignes dans un fichier ?

  3. Commande wc Linux

  4. Compter les lignes dans les fichiers volumineux

  5. Rotation du journal de stdout ?

Coller la commande sous Linux (fusionner les lignes)

Comment rediriger stderr vers stdout dans Bash

Comment mélanger les lignes dans un fichier sous Linux

Comment inverser les lignes d'un fichier par caractère sous Linux

5 façons de compter le nombre de lignes dans un fichier

Comment trouver la ou les lignes les plus longues dans un fichier sous Linux