menos con la opción -F y coincidencia de patrones

menos con la opción -F y coincidencia de patrones

Desde un script, quiero invocar lessun archivo y hacer que imprima el resultado en la consola, en lugar de una nueva pantalla. Si el archivo es lo suficientemente corto como para caber en una pantalla, quiero desactivar el desplazamiento. Si tiene más de una pantalla, quiero poder desplazarme por ella, pero una vez que llegue al final, quiero lessdevolver el control a la consola. Las líneas también deben cortarse (en este caso, está bien perder el final de las cadenas más allá de la ventana de la consola).

También me gustaría que resaltara un patrón determinado.

Esto es lo que estoy usando como argumentos:

less -SFXE -p "ccc" fileToShow.txt

Yo suelo -Scortar líneas largas, -FXpara detectar si el archivo tiene menos líneas que la consola e imprimir todo el texto en la consola sin desplazarme, y -Esalir lesscuando llego al final del archivo, para los casos en que el texto es más largo que la consola y necesito desplazarme.

Funcionan bien hasta que agrego el -pinterruptor para resaltar coincidencias.

Supongamos que fileToShow.txt contiene esto:

aaa
bbb
ccc
ddd
eee

Sin el cambio de patrón, obtengo esto:

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

Cuando agrego la coincidencia de patrones, less imprime las líneas vacías hasta la altura de la consola (usando tildes para mostrar las líneas vacías).

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

¿Hay alguna forma de usar el -pinterruptor y que no muestre esas líneas vacías cuando se usa -F? (Nota: la línea "ccc" está resaltada según lo desee, solo tengo este efecto secundario no deseado).

Mi shell es bash 3.2.25y mi versión less es 436. El sistema operativo es RHEL.

Respuesta1

El siguiente comando podría encapsularse en un archivo por lotes:

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

El parámetro $1es el nombre del archivo y $2es el patrón de búsqueda. Puntos a tener en cuenta:

  • grep -E(o egrep) permite hacer coincidir más de un patrón de búsqueda;
  • hacer coincidir con ^(inicio de línea) garantiza que se enumeren todas las líneas;
  • la coincidencia $2hace que la cadena de búsqueda se resalte;
  • grep --color=alwayscopia las secuencias de escape resaltadas en la tubería;
  • less -Rhace lessreproducir el resaltado en lugar de mostrar la secuencia de escape.

No es la mejor de las soluciones, sino algún tipo de respuesta. Tenga en cuenta que el comando enumerará todas las líneas, resaltando el patrón, mientras que less -pomite las líneas delante de la primera coincidencia: para reproducir esto necesitaría usar sed.

Respuesta2

Hay otra manera, todo incluido less. Sin embargo, implica algunos pasos.

  1. less fileToShow.txt
  2. Pulsa &ccc(suponiendo que cccsea el patrón que estás buscando). Desde la página de manual:

    &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. Finalmente, presione Fpara continuar con el seguimiento.

Respuesta3

No es del todo una solución, pero sí algunas mejoras -p...
Estas se basan en la +bandera flexible:

Si una opción de línea de comando comienza con +, el resto de esa opción se considera un comando inicial paramenos. Por ejemplo, +G dice menos para comenzar al final del archivo en lugar del principio, y +/xyzle indica que comience en la primera aparición de "xyz" en el archivo. Como caso especial, +<number>actúa como +<number>g; es decir, inicia la visualización en el número de línea especificado (sin embargo, consulte la advertencia bajo el comando "g" más arriba). Si la opción comienza con ++, el comando inicial se aplica a todos los archivos que se ven, no solo al primero. El + comando descrito anteriormente también se puede utilizar para establecer (o cambiar) un comando inicial para cada archivo.

-psalta al primer partido (o unas líneas antes si usas --jump-target). Esto no es lo que me gustaría combinar con salir cuando es corto: ¡las líneas omitidas ni siquiera son el desplazamiento hacia atrás de la terminal!

  1. Si inició lessy luego buscó interactivamente /ccc, less primero mostraría líneas desde el principio y solo luego se desplazaría, por lo queharíaconvertirse en parte del búfer de desplazamiento hacia atrás del terminal. Podemos emular ese uso +, pero debemos solicitar explícitamente volver a pintar con r:

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

    Esto todavía se desplaza hasta la ccclínea, pero ahora aaay bbbestán al menos en el búfer de desplazamiento hacia atrás. Sin embargo, si la búsqueda omite muchas líneas:

    seq 1000 | less -SFXE +r/980
    

    el desplazamiento hacia atrás mostrará algo como:

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

    Esperaba que esto pudiera ajustarse --max-back-scroll, pero no parece afectar la búsqueda. EDITAR: parece depender del tamaño de la ventana, es decir, llena una pantalla y luego salta.

  2. ¿Quién dijo que no quiero ver las primeras líneas? Si solo quiero resaltar coincidencias, podría usar el truco de coincidencias vacías:

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

    pero esto rompe la navegación con n/ N. Es mejor usar esta bandera en /la búsqueda:

    Ciertos caracteres son especiales si se ingresan al principio del patrón; modifican el tipo de búsqueda en lugar de formar parte del patrón:
    ...

    • ^K Resalte cualquier texto que coincida con el patrón en la pantalla actual, pero no pase a la primera coincidencia (MANTENGA la posición actual).

    La sintaxis para incluir Ctrl+Kchar depende del shell, en bash esto funciona:

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

    De cualquier manera, comenzar desde la primera línea también reduce la cantidad de veces que ~se llena la pantalla.

información relacionada