Comunidad Gambas-es
Concretar búsqueda en el buscador del editor de Gambas - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: Concretar búsqueda en el buscador del editor de Gambas (/thread-1554.html)



Concretar búsqueda en el buscador del editor de Gambas - Shell - 30-11-2023

Buenas!.

Estoy viendo la aplicación de Alberto.

Quiero buscar la palabra "CAJA" pero no quiero que se muestren palabras que contengan estas.
Por ejemplo no quiero que en los resultados de la búsqueda me muestre DIARIOCAJA ó BDCajaseguridad

He probado a marcar la opción Sólo palabras, pero no es la adecuada.

Creo que lo ideal es usar una expresión regular, pero no sé como se usan en el menú de búsquedas de Gambas.
Os muestro un ejemplo desde la línea de comandos.

Desde el menú de herramientas de Gambas, abro una terminal. Ahora estoy en el directorio raíz del proyecto.
Como sé que las fuentes del proyecto se encuentran en .src me voy a este.

Código:
cd .src

Ok, ahora vamos a usar el comando grep del shell de Linux.
En esta parte voy a buscar la palabra "CAJA" en todos los archivos del directorio fuente del proyecto.

Código:
grep -e 'CAJA' *

Me muestra: ( A ver como se muestra el Copy & Paste )
 
Cita: 
FMain.class:    TablaContactos = Conexion.Exec("Select * from DIARIOCAJA")
FMain.class:    TablaContactos = conexion.Exec("select * from DIARIOCAJA")
FMain.class:    TablaContactos = Conexion.Exec("Select * from DIARIOCAJA")
FMain.class:  TablaContactos = Conexion.Exec("Select * from DIARIOCAJA")
FMain.class:  VarResult = Conexion.Create("DIARIOCAJA")
FMain.class:  TablaContactos = Conexion.Exec("Select * from DIARIOCAJA")
FMain.class:  ' resultados = Conexion.Exec("Select sum(SALDO) TOTAL from DIARIOCAJA") 'OBTENEMOS LA SUMA TOTAL DEL CAMPO
FMain.class:  ruta = Application.Path &/ "CAJA"
FMain.class:  rutacopia = Application.Dir &/ "BDCAJAseguridad"
FMain.class:    Shell "cp /home/alberrto/Diariodecaja/*  /home/alberrto/BDCAJAseguridad"
FMain.class:    Shell "cp /home/alberrto/BDCAJAseguridad/*  /home/alberrto/Diariodecaja"
FMain.class:    Shell "mkdir /home/alberrto/BDCAJAseguridad"
FMain.class:    Shell "cp /home/alberrto/Diariodecaja/*  /home/alberrto/BDCAJAseguridad"
FMain.form:      Text = ("COPIA SEGURIDAD BASE DATOS CAJA")
frmes.class:    TablaContac = ConnX.Exec("Select * from DIARIOCAJA")
frmes.class:      TablaContac = ConnX.Exec("Select * from DIARIOCAJA where mes='" & TextBox1.text & "' ")
ModSQL.module:    .name = "CAJA"
reportdiarioenero.class:    TablaContactos = Con.Exec("Select * from DIARIOCAJA")
reportdiarioenero.class:  hRes1 = Con.Exec("Select * from DIARIOCAJA ")
Reportpormes.class:    TablaContactos = Con.Exec("Select * from DIARIOCAJA  ")
Reportpormes.class:  hRes1 = Con.Exec("Select * from DIARIOCAJA where MES='" & text1 & "' ")

Fijaros que muestra la palabra  pero esta contenida en otras.

Ahora vamos a usar una opción que tiene el comando Grep para que la búsqueda sea más exacta.

Código:
grep -w 'CAJA' *

Ahora se muestra esto:
 
Cita: 
Main.class:  ruta = Application.Path &/ "CAJA"
FMain.form:      Text = ("COPIA SEGURIDAD BASE DATOS CAJA")
ModSQL.module:    .name = "CAJA"

Preguntas.

¿ La característica de usar expresiones regulares en el buscador del editor de Gambas está activa ?
( Incluso si se tuviese que añadir al proyecto el componente gb.pcre ).
Encontré una referencia en la lista internacional pero es del año 2021!! y no hubo más respuestas. ( Nada concreto )
Si se supone que se muestra la opción, la característica debería estar incorporada, no es un adorno. Huh

¿ Cómo se usan las expresiones regulares en el menú de búsquedas del editor de Gambas ?. ( Con esta me conformo ). Wink

¿ Cómo podría hacer eso directamente en el menú de búsquedas del editor de Gambas ?. ( No es necesario. Me gusta complicarme.  Rolleyes )

Saludos

Revisando el código fuente de Gambas donde vemos la carpeta "Search".
Usa el comando grep aparentemente.

He usado esto y la respuesta es muy aproximado a lo que quiero.

[Imagen: jzAX6G3.png]

La salida fue:

[Imagen: N8AylOI.png]

Falta este, pero debe ser por la construcción de la expresión regular.
 
Cita:Main.form:      Text = ("COPIA SEGURIDAD BASE DATOS CAJA")


Por cierto, los paréntesis que muestro en la búsqueda no son necesarios. Con "CAJA", es suficiente.

No me convence. Esta buscando "CAJA" con las comillas incluidas

Esta es la función o procedimiento que usa el código fuente de Gambas para usar Grep.

Código:
Private Sub GrepFile(sPath As String, Optional bUseReplaceString As Boolean)
 
  Dim sText As String
  Dim aGrep As String[]
  Dim sGrep As String
  Dim sFind As String
  Dim sTemp As String
  ' Dim iAge As Integer
  ' Dim hGrepResult As CGrepResult
  Dim iPos As Integer
  Dim sSearch As String
  Dim hFile As Object
  Dim sResult As String
  Dim iFilePos As Integer
  Dim hEditor As TextEditor

  hFile = Project.Files[sPath]
 
  If sPath Then
    If Not hFile Or If Not hFile.IsModified() Then
      sTemp = sPath 'Project.GetUncompressedPath(sPath, True)
    Endif
  Endif
    
  If Not sTemp Then
    Try hEditor = hFile.GetEditor()
    If hEditor Then Object.Lock(hEditor)
    Try sText = hFile.GetText()
    If hEditor Then Object.Unlock(hEditor)
    If Not sText Then Return
    sTemp = Temp$("grep")
    File.Save(sTemp, sText)
  Endif

  aGrep = ["grep", "-nobs"]
 
  If bUseReplaceString Then
    ' aGrep.Add("-F")
    ' aGrep.Add("--")
    ' aGrep.Add(ReplaceString)
  Else
    If IgnoreCase Then aGrep.Add("-i")
    If RegularExpression Then
      aGrep.Add("-E")
    Else If WordsOnly Then
      aGrep.Add("-E")
    Else
      aGrep.Add("-F")
    Endif
    aGrep.Add("--")
    
    sSearch = Search
    If WordsOnly Then sSearch = "(^|[^_$[:alnum:]])" & Project.GrepQuote(Search) & "($|[^_$[:alnum:]])"
    aGrep.Add(sSearch)
  Endif
 
  aGrep.Add(sTemp)
 
  'grep -nR -F -I -i -w -ob --exclude=*~ --exclude-dir=.svn -s -- "Date" * .src
 
  Exec aGrep To sGrep

  For Each sFind In Split(sGrep, "\n", "", True)
    
    iPos = InStr(sFind, ":")
    If iPos = 0 Then Continue
    
    sResult = CStr(CInt(Left(sFind, iPos - 1)))
    sFind = Mid$(sFind, iPos + 1)
    
    iPos = InStr(sFind, ":")
    If iPos = 0 Then Continue
    
    iFilePos = CInt(Left(sFind, iPos - 1))
    sFind = Mid$(sFind, iPos + 1)

    If WordsOnly Then
      If IgnoreCase Then
        If String.LCase(sFind) Not Begins String.LCase(Search) Then iFilePos += String.Len(String.Left(sFind))
      Else
        If sFind Not Begins Search Then iFilePos += String.Len(String.Left(sFind))
      Endif
      sFind = Search
    Endif
    
    sResult &= ":" & CStr(iFilePos)

    sResult &= ":" & CStr(Len(sFind)) & ":" & CStr(String.Len(sFind)) '& ":" & sFind
    Print sResult
    Flush
    'Sleep 0.005
    
  Next
 
End

Eso es. Marca la opción solo palabras.

[Imagen: avnux3j.png]

Salida:

[Imagen: DIw8mJi.png]

Osea, usa el comando grep probablemente con expresiones regulares ( dentro de lo posible ), pero
no es necesario marcar la opción. Huh