有什么方法可以交互式地进行 grep,这意味着我有一堆来自某个地方的行我想通过管道进行进一步处理,并可以选择手动指定我想要的行?
考虑这个例子:
#Name Food Music
Adam Cake Rock
Bert Fruit Folk
Caesar Cake Rock
Doris Cake Folk
Emil Fruit Rock
Francis Fruit Folk
Gertrud Cake Rock
...
我可以获取此文件并使用类似的行对其进行过滤
cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk"
...让所有人都受邀参加素食民间派对。当我进一步自动化时:
cat people.txt | grep -v "^#" | grep "^.*Fruit.*Folk" | ??? | peopleInviterScript
...我想???
在管道中添加一些,让我可以在发送邀请之前选择/取消选择人员。
我只是不知道 bash/zsh 中已经有这样的工具了吗?
虽然我喜欢这种
vipe
方法,但我发现了一种更酷的方法:fzf。...提供了一个很好的列表,我可以在其中搜索并使用键盘切换项目,并在我完成后完全消失。
moreutils 有
vipe
,它只是作为管道的一部分运行您的常规文本编辑器(vi 或其他东西)。您未删除的任何行都将写回标准输出。(不过,通常情况下,您可以通过重定向到一个临时文件并编辑该文件来获得相同的结果。)您也可以为此使用
gvim
(andvim
)。插入你的管道,当你完成编辑时gvim /dev/stdin
,边做边写。:wq! /dev/stdout
如下调用 gvim 可以让您更自然地编写和关闭
ZZ
:您可以为其创建别名或函数:
这是我删除第 4-7 行并
ZZ
在正常模式下完成的示例:编辑:常规 vim 有点棘手,因为它使用 stdin 进行键盘输入,使用 stdout 绘制用户界面。但是,您仍然可以通过添加额外的进程来使用它。您将 vim 的 std* 重定向到终端,并使用父进程的 std* 作为数据管道。
临时文件是必需的,否则管道输出将与 vim 的用户界面混合,并可能在 vim 退出时随之消失。