GNU/Linux >> Linux の 問題 >  >> Linux

stdout に転送する前に行を手動で選択/選択解除する

vipeは好きだけど fzf です。

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

...検索してキーボードでアイテムを切り替えることができる素敵なリストが表示され、作業が完了すると完全に消えます。


moreutils には vipe があります 、通常のテキスト エディター (vi など) をパイプラインの一部として実行するだけです。削除しない行は、stdout に書き戻されます。 (ただし、一般的には、一時ファイルにリダイレクトしてそのファイルを編集しても同じ結果が得られます。)


gvim も使用できます (そして vim ) このため。 gvim /dev/stdin を挿入 パイプに入れ、 :wq! /dev/stdout を実行して書き込みます 編集が終わったら

次のように gvim を呼び出すと、 ZZ でより自然に記述して閉じることができます :

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

そのエイリアスまたは関数を作成できます:

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

これは、4 行目から 7 行目を削除し、ZZ を実行して終了した例です。 通常モード:

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

編集:通常の vim は、キーボード入力に stdin を使用し、ユーザー インターフェイスの描画に stdout を使用するため、もう少し注意が必要です。ただし、プロセスを追加することで引き続き使用できます。 vim の std* を端末にリダイレクトし、親プロセスの std* をデータ パイプに使用します。

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

一時ファイルが必要です。そうしないと、パイプ出力が vim のユーザー インターフェイスと混ざり、vim の終了時に一緒に消えてしまう可能性があるからです。


Linux
  1. Linuxで出力をファイルとStdoutにリダイレクトする方法

  2. 巨大なファイルの線Xから線Yへの猫?

  3. ファイルの内容をStdoutに出力するコマンド?

  1. 別のファイルにIDがリストされているテキストファイルから行を選択しますか?

  2. ファイルの行数を数えますか?

  3. ファイルまたはスクリプト内のパイプから複数の行を選択する方法は?

  1. 別の行からのAWK?

  2. Linuxwcコマンド

  3. 大きなファイルの行数を数える