I když se mi líbí vipe
přístup, našel jsem ještě chladnější způsob:fzf.
cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk" | fzf -m | cat
...poskytuje pěkný seznam, kde mohu vyhledávat a přepínat položky pomocí klávesnice, a když skončím, úplně zmizí.
moreutils má vipe
, který pouze spouští váš běžný textový editor (vi nebo tak něco) jako součást potrubí. Všechny řádky, které neodstraníte, budou zapsány zpět do stdout. (Obecně však stejný výsledek získáte přesměrováním na dočasný soubor a úpravou tohoto souboru.)
Můžete také použít gvim
(a vim
) pro tohle. Vložte gvim /dev/stdin
do vaší roury a zapište pomocí :wq! /dev/stdout
až dokončíte úpravy.
Volání gvim následujícím způsobem vám umožní přirozeněji psát a zavírat pomocí ZZ
:
gvim +'nmap ZZ :wq!<cr> | r /dev/stdin | 1d | file /dev/stdout'
Můžete vytvořit alias nebo funkci toho:
gvimp() {
gvim +'
nmap ZZ :wq!<cr>
r /dev/stdin
1d
file /dev/stdout
'
}
Zde je příklad, kdy jsem smazal řádky 4-7 a dokončil to provedením ZZ
v normálním režimu:
$ seq 1 10 | gvimp | sed -r 's/^|$/=/g'
=1=
=2=
=3=
=8=
=9=
=10=
EDIT:Běžný vim je trochu složitější, protože používá stdin pro vstup z klávesnice a stdout pro kreslení uživatelského rozhraní. Stále jej však můžete používat přidáním dalšího procesu. Přesměrujete std* vim na terminál a pro datový kanál použijete std* nadřazeného procesu.
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"
'
}
Dočasný soubor je nutný, protože jinak se výstup roury smísí s uživatelským rozhraním vim a může zmizet s ním, když vim skončí.