¿Cómo usar fzf para buscar dentro de todas las líneas de archivos (ignorar las nuevas líneas)?

¿Cómo usar fzf para buscar dentro de todas las líneas de archivos (ignorar las nuevas líneas)?

Elpágina wiki de ejemplos de fzfdescribe cómo se puede utilizar fzf para realizar búsquedas difusas dentro del contenido de todos los archivos de un directorio. Pero en los ejemplos de la página wiki, por ejemplo con

ag --nobreak --nonumbers --noheading . | fzf

los archivos se dividen por líneas y cada línea se trata por separado.

Por ejemplo un archivo:

hello
world

no coincidiría con el término de búsqueda "hola mundo" porque los términos de búsqueda están en líneas diferentes.

¿Cómo puedo usar fzf para que busque en todo el archivo y no solo por líneas?

Respuesta1

Tengo una solución un tanto sucia.

rg --heading --glob "*.txt" . some_directory_path | sed 's/^$/NEWLINEHEREYO/g' | tr '\n' ' ' | sed 's/NEWLINEHEREYO/\n/g' | fzf

explicación:

Cuando tu lo hagas

rg . 

en algún lugar, imprime la salida al terminal en un formato específico que se pierde si intenta canalizarla a algún lugar. Creo que el formato es necesario para poder hacer esto de manera eficiente. De ahí la bandera --heading que mantiene el formato. --glob y el directorio que agregué solo porque lo hice en mi propio caso de uso y no quería modificar el comando para que no se rompiera; no soy tan bueno con las computadoras.

Luego reemplaza todas las líneas vacías, que delimitan archivos, con la etiqueta NEWLINEHEREYO usando sed. Luego trunca todos los caracteres de nueva línea (lo que destruiría las líneas vacías) usando tr, dando una salida de una sola línea, que es lo que quería. Luego reintroduce los saltos con otro comando sed convirtiendo los NEWLINEHEREYO nuevamente en saltos de línea para que fzf no los busque como si fuera literalmente una sola línea.

Es muy ineficiente, pero funciona bien para mi caso de uso. Creo que los comandos sed, tr y sed probablemente se puedan fusionar en uno, pero soy demasiado estúpido para hacerlo.

información relacionada