假设我们列出/usr/bin
了ls
– 这可能看起来像:
CC file2c man sscop
Mail find mandoc ssh
addftinfo finger manpath ssh-add
addr2line flex merge ssh-agent
...
但我们也可以使用ls -1
,我们得到:
CC
Mail
addftinfo
addr2line
afmtodit
alias
apply
apropos
...
包含所有文件名的列表,每个文件名都在一行中。输出的结构为:文件名、换行符 ( \n
)、...
我们可以通过管道传递到less
:ls -1 | less
现在,是否可以轻松地将命令应用于当前行中包含的字符串?
具体如何完成并不重要,只是步骤数量应该很小。可以通过使用!
less (这似乎不可能?)或通过不知何故将当前行中包含的字符串放入 shell 变量等中。
在 Xorg 下这当然很容易,只需使用鼠标中键粘贴即可。但在文本模式下,能用一种不太复杂的方式来做?
答案1
您可以使用|
命令通过另一个程序传输文件的一部分,但该部分始终至少有两行。你可以把它和标记一起破解tail
, 尽管:
- 将您想要的行放在顶部,按ma(或第二个字母的任何其他字母)。
- k使用或向上滚动一行Up。
- 按|,然后按您选择的字母来代替a上面的字母。
- 输入
tail -n 1 | ...
,其中...
是将这一行作为其标准输入的任何命令。
tail -n 1
只会给我们第二行,这是我们关心的。...
让这条线按照它的意愿去做。
如果您想使用该行作为命令的参数而不是标准输入,您可以使用xargs
或其他包装器:
tail -n 1 | xargs ls -l
如果该命令显示任何内容,它将不会在屏幕上保持可见,但您可以less
再次通过管道将其发送到:
tail -n 1 | xargs ls -l | less
这将是一个嵌套less
:您退出它,然后回到原始状态less
,并且可以重复该过程。
如果命令是交互式的,就像文本编辑器一样,并且不喜欢其标准输入是管道或空,您可以使用sh
中间的进程运行命令并重新打开 tty:
xargs sh -c 'vim "$@" < /dev/tty' sh
BSDxargs
也可以-o
选择做同样的事情。
答案2
实现这一目标的一种方法是:
- 移至所需的选择开始处(例如,通过搜索)。
- m后面跟着一些字母,说X是设置标记。
- 移至所选内容的末尾。
- |X(这将切换到
!
提示符,您需要在其中编写一个命令,该命令将在标准输入上进行选择。 - 输入命令并按RET