¿Cómo hacer una búsqueda multilínea en menos?

18

En less, ¿puedes buscar usando /un patrón que contenga un retorno de carro y una nueva línea? Sé que su patrón puede terminar con una línea usando $( ¿Cómo incluyo nuevas líneas en una búsqueda en menos? ), Pero necesito que el patrón coincida con el texto que abarca varias líneas.

Lo intenté \n, pero eso solo busca el npersonaje.

yonran
fuente
¿Has probado \n+1 o más líneas nuevas?
Brock Hensley
¿Qué distribución de Linux, y ha definido la variable de entorno "MENOS"?
harrymc
@harrymc ¿Cómo ayudaría eso con la búsqueda multilínea?
sashoalm
Reuniendo información.
harrymc
2
Esto no es posible, basado en una revisión del código fuente de less( search.c:search_range()). La operación de búsqueda / coincidencia se realiza en una sola línea delimitada por una nueva línea a la vez, por lo que no puede hacer coincidir los límites de la línea. Consulte line.c:forw_raw_line()para la implementación de "readline" como lo solicitó search_range.
zackse

Respuestas:

7

No es posible hacer coincidir los límites de la línea, porque la función de búsqueda en lessopera en una sola línea delimitada por una nueva línea a la vez. Este es el caso independientemente de la implementación de expresiones regulares del sistema (GNU, POSIX, PCRE, etc.).

Tenga en cuenta que no pude encontrar un repositorio fuente oficial para el desarrollo de la línea principal less, pero para fines de revisión de código aquí, los enlaces que siguen son del árbol contrib FreeBSD.

Consulte search.c: search_range () para la implementación de la operación de búsqueda. El bucle allí llama a line.c: forw_raw_line () para recuperar el siguiente bloque de contenido delimitado por nueva línea. Ese bloque se pasa a match.c: match_pattern () donde se ejecuta el patrón de búsqueda (expresión regular).

Para hacer coincidir varias líneas, deberá utilizar una herramienta diferente. Una opción es ingresar a su editor y usar sus capacidades de búsqueda como lo sugieren otros. Puede invocar el editor pulsando ven less.

zackse
fuente
2

No estoy seguro de cómo hacerlo less, pero puede lograr lo mismo en vim.

http://vim.wikia.com/wiki/Search_across_multiple_lines

/PATTERN1\\_.\\{-}PATTERN2

El átomo \\_.encuentra cualquier carácter, incluido el final de línea. El multi \\{-}coincide lo menos posible.

Vam
fuente
1
Sin embargo, esto no responde a la pregunta, ya que se trata de menos, no de vim. Debería ser un comentario.
sashoalm
1
@sashoalm Todavía es un intento de respuesta, así que lo votaría y seguiría. Es posible que las personas que buscan una solución no estén obligadas a usar una herramienta específica.
slhck
2

lessestá utilizando la edsintaxis regex y desafortunadamente no admite la coincidencia de varias líneas.

https://www.gnu.org/software/gnulib/manual/html_node/ed-regular-expression-syntax.html#ed-regular-expression-syntax

Esperaba encontrar eso también, o al menos encontrar si este bit de sintaxis se utilizó en less:

RE_DOT_NEWLINE Si se establece este bit, entonces el operador de coincidencia de cualquier carácter coincide con una nueva línea; Si este bit no está configurado, entonces no lo está.

Entonces puedo usar el .+patrón para unir nuevas líneas. Pero no, no lo hace.

estimular
fuente