GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Manuelles Auswählen/Abwählen von Leitungen vor dem Weiterleiten an stdout

Wobei ich den vipe mag Ansatz habe ich einen noch cooleren Weg gefunden:fzf.

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

...gibt eine schöne Liste, in der ich die Elemente mit der Tastatur suchen und umschalten kann, und verschwindet vollständig, wenn ich fertig bin.


moreutils hat vipe , die einfach Ihren normalen Texteditor (vi oder so) als Teil der Pipeline ausführt. Alle Zeilen, die Sie nicht löschen, werden nach stdout zurückgeschrieben. (Im Allgemeinen erhalten Sie jedoch dasselbe Ergebnis, wenn Sie zu einer temporären Datei umleiten und diese Datei bearbeiten.)


Sie können auch gvim verwenden (und vim ) dafür. Fügen Sie gvim /dev/stdin ein in Ihre Pipe und schreiben Sie, indem Sie :wq! /dev/stdout ausführen wenn Sie mit der Bearbeitung fertig sind.

Wenn Sie gvim wie folgt aufrufen, können Sie natürlicher schreiben und mit ZZ schließen :

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

Sie können daraus einen Alias ​​oder eine Funktion machen:

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

Hier ist ein Beispiel, wo ich die Zeilen 4-7 gelöscht und mit ZZ abgeschlossen habe im normalen Modus:

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

BEARBEITEN:Reguläres vim ist etwas kniffliger, da es stdin für Tastatureingaben und stdout zum Zeichnen der Benutzeroberfläche verwendet. Sie können es jedoch weiterhin verwenden, indem Sie einen zusätzlichen Prozess hinzufügen. Sie leiten die std* von vim zum Terminal um und verwenden die std* des übergeordneten Prozesses für die Datenpipeline.

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

Die temporäre Datei ist notwendig, weil sonst die Pipe-Ausgabe mit der Benutzeroberfläche von vim vermischt wird und mit ihr verschwinden könnte, wenn vim beendet wird.


Linux
  1. Cat Zeile X bis Zeile Y in einer riesigen Datei?

  2. Zeilen aus Textdatei auswählen, deren IDs in einer anderen Datei aufgeführt sind?

  3. Befehl zum Ausgeben von Dateiinhalten an Stdout?

  4. Linux-wc-Befehl

  5. Wie wähle ich mehrere Zeilen aus einer Datei oder aus einer Pipe in einem Skript aus?

Befehl Einfügen unter Linux (Zeilen zusammenführen)

So leiten Sie stderr in Bash auf stdout um

So mischen Sie Zeilen in einer Datei unter Linux

So kehren Sie Zeilen in einer Datei zeichenweise in Linux um

5 Möglichkeiten, die Anzahl der Zeilen in einer Datei zu zählen

So finden Sie die längste(n) Zeile(n) in einer Datei in Linux