меньше с опцией -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» выделена, как и требовалось, у меня просто возник этот непреднамеренный побочный эффект.)

Моя оболочка — , 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копирует выделяемые escape-последовательности в канал;
  • less -Rзаставляет lessвоспроизводить подсветку вместо показа последовательности выхода.

Это не самое изящное решение, но своего рода ответ. Обратите внимание, что команда выведет список всех строк, выделив шаблон, но less -pопустит строки перед первым совпадением: чтобы воспроизвести это, вам нужно будет использовать sed.

решение2

Есть еще один способ, all in less. Но он включает в себя несколько шагов.

  1. less fileToShow.txt
  2. Hit &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строки, но теперь aaaи bbbнаходятся по крайней мере в буфере прокрутки назад. Однако если поиск пропускает много строк:

    seq 1000 | less -SFXE +r/980
    

    прокрутка покажет что-то вроде:

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

    Я ожидал, что это можно будет настроить с помощью --max-back-scroll, но, похоже, это не влияет на поиск. EDIT: похоже, это зависит от размера окна, т. е. оно заполняет один экран, а затем пропускает.

  2. Кто сказал, что я не хочу видеть первые строки? Если я хочу только выделить совпадения, я могу использовать трюк с пустой спичкой:

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

    но это нарушает навигацию с n/ N. Лучше использовать этот флаг при /поиске:

    Некоторые символы являются специальными, если они введены в начале шаблона; они изменяют тип поиска, а не становятся частью шаблона:
    ...

    • ^K Выделите любой текст, соответствующий шаблону на текущем экране, но не переходите к первому совпадению (СОХРАНИТЕ текущую позицию).

    Синтаксис включения Ctrl+Kchar зависит от оболочки, в bash это работает:

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

    В любом случае, запуск с первой строки также уменьшает количество ~заполнений экрана.

Связанный контент