使用 -F 选项和模式匹配

使用 -F 选项和模式匹配

我想从脚本less中调用一个文件,并让其将输出打印到控制台,而不是新屏幕。如果文件足够短,可以放在一个屏幕上,我想禁用滚动。如果它长于一个屏幕,我希望能够滚动浏览它,但一旦到达底部,我希望将less控制权返回到控制台。行也应该被截断(在这种情况下,丢失控制台窗口后面的字符串末尾是可以的)。

我还希望它能够凸显某种模式。

以下是我使用的参数:

less -SFXE -p "ccc" fileToShow.txt

我用-S它来截断长行,-FX检测文件的行数是否少于控制台,并将所有文本打印到控制台而不滚动,当到达文件末尾时-E退出less,适用于文本长于控制台而需要滚动的情况。

在我添加突出显示匹配的开关之前,这些都运行良好-p

假设 fileToShow.txt 包含以下内容:

aaa
bbb
ccc
ddd
eee

如果没有模式切换,我会得到以下结果:

[evan@localhost] $ less -SFXE fileToShow.txt
aaa
bbb
ccc
ddd
eee
[evan@localhost] $ 

当我添加模式匹配时,less 会打印出直到控制台高度的空行(使用波浪号显示空行)。

[evan@localhost] $ less -SFXE -p "ccc" fileToShow.txt
ccc
ddd
eee
~
~
~
~
~
~
~
~
[evan@localhost] $ 

有没有办法使用该-p开关,并且在使用时不显示那些空行-F?(注意:“ccc”行按需要突出显示,我只是有这个意想不到的副作用。)

我的shell是bash 3.2.25,我的less版本是436。操作系统是RHEL。

答案1

以下命令可以封装在批处理文件中:

 grep --color=always -E "^|$2" "$1"|less -SFXER

参数$1是文件名,$2是搜索模式。注意事项:

  • grep -E(或egrep)允许匹配多个搜索模式;
  • 匹配到^(行首)确保列出每一行;
  • 匹配$2会导致搜索字符串被突出显示;
  • grep --color=always将突出显示的转义序列复制到管道;
  • less -R重现less突出显示而不是显示转义序列。

这不是最完美的解决方案,但也是某种答案。请注意,该命令将列出所有行,突出显示模式,而less -p忽略第一个匹配项之前的行:要重现此情况,您需要使用sed

答案2

还有另一种方法,全部投入less。不过,它涉及几个步骤。

  1. less fileToShow.txt
  2. 命中&ccc(假设ccc是您要寻找的模式)。来自手册页:

    &pattern: Display only lines which match the pattern; lines which do not match the pattern are not displayed. If pattern is empty (if you type & immediately followed by ENTER), any filtering is turned off, and all lines are displayed. While filtering is in effect, an ampersand is displayed at the beginning of the prompt, as a reminder that some lines in the file may be hidden. Certain characters are special as in the / command: ^N or ! Display only lines which do NOT match the pattern. ^R Don't interpret regular expression metacharacters; that is, do a simple textual comparison.

  3. 最后,按F恢复拖尾

答案3

虽然不是完全的解决方案,但有一些改进-p...
这些依赖于灵活的+标志:

如果命令行选项以 开头+,则该选项的其余部分将被视为较少的。例如, +G 告诉 较少的 从文件末尾而不是开头开始,并+/xyz告诉它从文件中第一次出现“xyz”的地方开始。作为特殊情况,它的+<number>作用类似于+<number>g;也就是说,它从指定的行号开始显示(但是,请参阅上面“g”命令下的警告)。如果选项以 开头 ++,则初始命令适用于正在查看的每个文件,而不仅仅是第一个文件。 + 前面描述的命令也可用于设置(或更改)每个文件的初始命令。

-p跳到第一个匹配项(或者如果使用 则跳到匹配项之前的几行--jump-target)。这不是我想要的,结合短时间退出 — 跳过的行甚至不是终端的回滚!

  1. 如果你启动less然后进行交互搜索/ccc,less 会先从头开始显示行,然后才滚动,所以它们成为终端回滚缓冲区的一部分。我们可以使用来模拟,+但我们需要使用以下方法明确请求重新绘制r

    env LESS= less -SFXE +r/ccc fileToShow.txt
    

    这仍然会滚动到该ccc行,但现在aaabbb至少位于回滚缓冲区中。但是,如果搜索跳过了很多行:

    seq 1000 | less -SFXE +r/980
    

    回滚将显示类似以下内容:

     48
     49
     50
     ...skipping...
     980
     981
     982
    

    我预计这将可以通过 进行调整--max-back-scroll,但它似乎不会影响搜索。编辑:它似乎取决于窗口大小,即它填满一个屏幕,然后跳过。

  2. 谁说我不想看第一行?如果我只想突出显示匹配项,我可以使用空匹配技巧:

     less -SFXE '+r/ccc|$' fileToShow.txt
    

    但这会破坏使用n/ 的导航N。最好在/搜索时使用此标志:

    如果在模式的开头输入某些字符,则它们很特殊;它们会修改搜索类型而不是成为模式的一部分:
    ...

    • ^K 突出显示当前屏幕上与模式匹配的任何文本,但不要移动到第一个匹配项(保持当前位置)。

    包含 char 的语法Ctrl+K取决于 shell,在 bash 中这是有效的:

     less -SFXE $'+r/\cKccc' fileToShow.txt
    

    ~无论哪种方式,从第一行开始也会减少填充屏幕的数量

相关内容