在 less 中将命令应用于当前行?

在 less 中将命令应用于当前行?

假设我们列出/usr/binls– 这可能看起来像:

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)、...

我们可以通过管道传递到lessls -1 | less

现在,是否可以轻松地将命令应用于当前行中包含的字符串?

具体如何完成并不重要,只是步骤数量应该很小。可以通过使用!less (这似乎不可能?)或通过不知何故将当前行中包含的字符串放入 shell 变量等中。

在 Xorg 下这当然很容易,只需使用鼠标中键粘贴即可。但在文本模式下,用一种不太复杂的方式来做?

答案1

您可以使用|命令通过另一个程序传输文件的一部分,但该部分始终至少有两行。你可以把它和标记一起破解tail, 尽管:

  1. 将您想要的行放在顶部,按ma(或第二个字母的任何其他字母)。
  2. k使用或向上滚动一行Up
  3. |,然后按您选择的字母来代替a上面的字母。
  4. 输入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

实现这一目标的一种方法是:

  1. 移至所需的选择开始处(例如,通过搜索)。
  2. m后面跟着一些字母,说X是设置标记。
  3. 移至所选内容的末尾。
  4. |X(这将切换到!提示符,您需要在其中编写一个命令,该命令将在标准输入上进行选择。
  5. 输入命令并按RET

相关内容