Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa Narcis Garcia

El 17/1/24 a les 21:39, Ernest Adrogué ha escrit:

2024-01-17, 08:39 (+0100); Narcis Garcia escriu:

Bones,

Tinc un fitxer de text, com podria ser per exemple una llista de números de
telèfon (coneguts.txt):
972123456
97233
97234
97235
97236
972789012
però m'agradaria representar-hi rangs compatibles (expressions regulars) per
abreviar:
972123456
972..
972789012


Hi ha una cosa que no entenc.  El patró "972.." representa els
números 97200, 97201, 97202, ..., 97298, 97299.
Mentre que a la teva llista només hi tens el 97233, 97234,
97235, i el 97236.  Si substitueixes aquests números pel patró
"972.." el resultat és un conjunt de números que és DIFERENT de
l'original.



No era més que un exemple; la primera llista com si fos la típica (per a 
filtrar de forma senzilla amb grep), i la segona com voldria poder-la 
fer. És a dir, en comptes de fer una llista amb 100 línies «972xx» 
(del 00 al 99) poder-hi posar un patró en una sola línia.


PERÒ igualment el tema dels números de telèfon és només un exemple 
senzill; no es tracta dels números sinó de buscar patrons amb una cadena 
fixa en comptes de buscar cadenes amb un patró.


Exemple amb números de DNI; la llista seria:
ES. Spain
FR. France
.DE Germany
IT. Italy

I donat un DNI «55667788DE» poder trobar la línia del patró corresponent:
.DE Germany
I així extraure el nom de l'estat després de l'espai: Germany.

Cas més sofisticat; Rangs d'adreces IPv4 en un fitxer «spammers.txt»:
55\.66\.77\.88
66\.77\.88\..*
99\.11\.22\.33

i amb això trobar que si la IP de l'interlocutor té coincidència a la 
llista, aleshores no acceptar-lo. I així poder incloure rangs també.


--

Narcis Garcia

__
I'm using this dedicated address because personal addresses aren't 
masked enough at this mail public archive. Public archive administrator 
should remove and omit any @, dot and mailto combinations against 
automated addresses collectors.




Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa Eloi

(disculpes, he enviat abans d'hora)

El 17/1/24 a les 22:10, Eloi ha escrit:

El 17/1/24 a les 16:10, julio ha escrit:


El 17 de gener de 2024 8:39:26 CET, Narcis Garcia 
 ha escrit:

Bones,

Tinc un fitxer de text, com podria ser per exemple una llista de 
números de telèfon (coneguts.txt):

972123456
97233
97234
97235
97236
972789012
però m'agradaria representar-hi rangs compatibles (expressions 
regulars) per abreviar:

972123456
972..
972789012

Com no estem acotant amb ^  ni amb $


9
7
2
.
etcètera
97
72
21
9.
.9
etc
972
97.
9.2

I això sense fent servir només dígits i el caràcter . no literal.

Sembla un problema matemàtic de combinatòria :)

O probablement no ho he entès.

Vagi bé.

Suposant que el que es cerca són números de N dígits i que els patrons 
de cerca son igualment de N caràcters i no fan servir repeticions (o 
sigui, que troben o bé un caràcter específic o bé qualsevol), 
existeixen 2^N patrons que coincideixen amb un número de N dígits. Amb 
N=9 són 512 patrons compatibles.


Si a més del . (qualsevol dígit) vols també poder indicar rangs de 
dígits [0-9], per a cada posició tens 10 rangs possibles, incloent el 
[0-9] equivalent al . i el [d-d] equivalent al dígit específic (en 
general, tindries el rang [k-d] (o [d-k] si k>d) per k=0..9 i d 
fixat). En aquest cas, són 10^N els possibles patrons que pot complir 
un nombre de N dígits, que ja són 100 milions per N=9.


Si acceptes patrons amb un subconjunt arbitrari de dígits per a cada 
posició (posem per cas, els senars), crec que tindries sum(k=1..10, 
10!/((10-k)!·k!)) (tinc la combinatòria molt rovellada), que és una 
burrada que després encara s'haurà d'elevar a la novena potència.


De tots aquests possibles patrons, quin seria el que esperaries com a 
resultat correcte?


Per contra, si el que t'interessa saber és, a partir d'una llista 
predefinida de patrons, quin(s) d'ells trobarien un valor específic, 
podries fer-ho en un bucle:


{ while read -n PATTERN; do echo $1 | grep -q "^${PATTERN}$" && echo 
"$PATTERN"; done; } < coneguts.txt


Tingues present que, a priori, no tens cap garantia d'unicitat.



Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa Eloi

El 17/1/24 a les 16:10, julio ha escrit:


El 17 de gener de 2024 8:39:26 CET, Narcis Garcia  ha 
escrit:

Bones,

Tinc un fitxer de text, com podria ser per exemple una llista de números de 
telèfon (coneguts.txt):
972123456
97233
97234
97235
97236
972789012
però m'agradaria representar-hi rangs compatibles (expressions regulars) per 
abreviar:
972123456
972..
972789012

Com no estem acotant amb ^  ni amb $


9
7
2
.
etcètera
97
72
21
9.
.9
etc
972
97.
9.2

I això sense fent servir només dígits i el caràcter . no literal.

Sembla un problema matemàtic de combinatòria :)

O probablement no ho he entès.

Vagi bé.

Suposant que el que es cerca són números de N dígits i que els patrons 
de cerca son igualment de N caràcters i no fan servir repeticions (o 
sigui, que troben o bé un caràcter específic o bé qualsevol), existeixen 
2^N patrons que coincideixen amb un número de N dígits. Amb N=9 són 512 
patrons compatibles.


Si a més del . (qualsevol dígit) vols també poder indicar rangs de 
dígits [0-9], per a cada posició tens 10 rangs possibles, incloent el 
[0-9] equivalent al . i el [d-d] equivalent al dígit específic (en 
general, tindries el rang [k-d] (o [d-k] si k>d) per k=0..9 i d fixat). 
En aquest cas, són 10^N els possibles patrons que pot complir un nombre 
de N dígits, que ja són 100 milions per N=9.


Si acceptes patrons amb un subconjunt arbitrari de dígits per a cada 
posició (posem per cas, els senars), crec que tindries sum(k=1..10, 
10!/((10-k)!·k!)) (tinc la combinatòria molt rovellada), que és una 
burrada que després encara s'haurà d'elevar a la novena potència.


De tots aquests possibles patrons, quin seria el que esperaries com a 
resultat correcte?




Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa Ernest Adrogué
2024-01-17, 08:39 (+0100); Narcis Garcia escriu:
> Bones,
> 
> Tinc un fitxer de text, com podria ser per exemple una llista de números de
> telèfon (coneguts.txt):
> 972123456
> 97233
> 97234
> 97235
> 97236
> 972789012
> però m'agradaria representar-hi rangs compatibles (expressions regulars) per
> abreviar:
> 972123456
> 972..
> 972789012

Hi ha una cosa que no entenc.  El patró "972.." representa els
números 97200, 97201, 97202, ..., 97298, 97299.
Mentre que a la teva llista només hi tens el 97233, 97234,
97235, i el 97236.  Si substitueixes aquests números pel patró
"972.." el resultat és un conjunt de números que és DIFERENT de
l'original.


Salutacions



Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa papapep
Per a aquestes cosetes, awk és una navalla suïssa. Amb un oneliner com:

awk '/pauta_a_buscar/ {print $0}' fitxer_on_buscar

et treurà totes les coincidències.

Salut.


El 17 de gener de 2024 19:34:07 CET, Narcis Garcia  ha 
escrit:
>Aquesta proposta(2) té sentit, i de fet necessito incloure-ho en un programet 
>ShellScript, però volia veure si podia evitar un bucle «for» utilitzant alguna 
>comanda directa de grep, pcregrep o similar.
>
>Gràcies.
>
>
>El 17/1/24 a les 15:35, Xavier Drudis Ferran ha escrit:
>> 
>> 
>> El primer cas que demanaves sembla fàcil
>> 
>> grep -f fitxer_regexps.txt fitxer_nums.txt
>> 
>> Pel segon no sé cap comanda directa, potser alguna cosa tipus
>> 
>> #!/bin/bash
>> text=${1:-93123111}
>> fitxer_regexps=${2:-fitxer_regexps.txt}
>> 
>> for r in $(< "$fitxer_regexps") ; do {
>> grep -qE "$r" - <<< "$text" && echo "$r" ;
>> } ; done
>> 
>> 
>> Però això podria ser més eficient si t'ho programes el perl o python o
>> el que sigui...
>> 
>
>-- 
>
>Narcis Garcia
>
>__
>I'm using this dedicated address because personal addresses aren't masked 
>enough at this mail public archive. Public archive administrator should remove 
>and omit any @, dot and mailto combinations against automated addresses 
>collectors.
>


Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa Narcis Garcia

Aquesta proposta d'en Joan funciona:

Coneguts="3493000
3.93000
.493000
4493000
4.93000"

echo "$Coneguts" > coneguts.txt

CercantInici="34"

PatroCerca="^$(echo "$CercantInici" | sed -ne 's/\([0-9]\)/[\.\1]/gp')"

echo "$PatroCerca"

grep -E "$PatroCerca" coneguts.txt

GRÀCIES!


El 17/1/24 a les 17:53, Joan Montané ha escrit:



Missatge de Narcis Garcia > del dia dc., 17 de gen. 2024 a les 8:39:


Bones,


Algú sap com fer-ho?


Si he entès bé el problema, la cosa seria així:

cat coneguts.txt | grep -E "^[\.3][\.4]"

El que faig és (manualment) canviar cada caràcter del prefix (per 
exemple, 3) que vols buscar per la parella formada pel mateix caràcter i 
un punt normal (en l'exemple [\.3]). La resta és senzill, cercar en el 
fitxer amb dades per l'expressió regular de línies que comencin per 
l'expressió regular.


Una millora seria fer la conversió "34" a "[\.3][\.4]" de forma automàtica.

Un primer intent pot ser amb 'sed', per exemple:

echo 34 | sed -ne 's/\([0-9]\)/[\.\1]/gp

retorna:
[.3][.4]

que podem usar en l'ordre inicial proposada.

Ajuntant les dues coses...

PREFIX=`echo 34 | sed -ne 's/\([0-9]\)/[\.\1]/gp'`
cat coneguts.txt | grep -E "^$PREFIX"

sembla que hauria de rutllar.

En una única línia...
PREFIX=`echo 44 | sed -ne 's/\([0-9]\)/[\.\1]/gp'` && cat coneguts.txt | 
grep -E "^$PREFIX"


Sí, uso una variable d'entorn per a guardar el prefix en la forma 
[\.3][\.4]. Si algú sap com enviar aquesta cadena al grep d'una forma 
més elegant, que ho digui, sisplau.


És això el que volies?

Salut!
Joan Montané




--

Narcis Garcia

__
I'm using this dedicated address because personal addresses aren't 
masked enough at this mail public archive. Public archive administrator 
should remove and omit any @, dot and mailto combinations against 
automated addresses collectors.


--
Narcis Garcia



Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa Narcis Garcia

Aquesta proposta d'en Joan funciona:

Coneguts="3493000
3.93000
.493000
4493000
4.93000"

echo "$Coneguts" > coneguts.txt

CercantInici="34"

PatroCerca="^$(echo "$CercantInici" | sed -ne 's/\([0-9]\)/[\.\1]/gp')"

echo "$PatroCerca"

grep -E "$PatroCerca" coneguts.txt

GRÀCIES!


El 17/1/24 a les 17:53, Joan Montané ha escrit:



Missatge de Narcis Garcia > del dia dc., 17 de gen. 2024 a les 8:39:


Bones,


Algú sap com fer-ho?


Si he entès bé el problema, la cosa seria així:

cat coneguts.txt | grep -E "^[\.3][\.4]"

El que faig és (manualment) canviar cada caràcter del prefix (per 
exemple, 3) que vols buscar per la parella formada pel mateix caràcter i 
un punt normal (en l'exemple [\.3]). La resta és senzill, cercar en el 
fitxer amb dades per l'expressió regular de línies que comencin per 
l'expressió regular.


Una millora seria fer la conversió "34" a "[\.3][\.4]" de forma automàtica.

Un primer intent pot ser amb 'sed', per exemple:

echo 34 | sed -ne 's/\([0-9]\)/[\.\1]/gp

retorna:
[.3][.4]

que podem usar en l'ordre inicial proposada.

Ajuntant les dues coses...

PREFIX=`echo 34 | sed -ne 's/\([0-9]\)/[\.\1]/gp'`
cat coneguts.txt | grep -E "^$PREFIX"

sembla que hauria de rutllar.

En una única línia...
PREFIX=`echo 44 | sed -ne 's/\([0-9]\)/[\.\1]/gp'` && cat coneguts.txt | 
grep -E "^$PREFIX"


Sí, uso una variable d'entorn per a guardar el prefix en la forma 
[\.3][\.4]. Si algú sap com enviar aquesta cadena al grep d'una forma 
més elegant, que ho digui, sisplau.


És això el que volies?

Salut!
Joan Montané




--

Narcis Garcia

__
I'm using this dedicated address because personal addresses aren't 
masked enough at this mail public archive. Public archive administrator 
should remove and omit any @, dot and mailto combinations against 
automated addresses collectors.




Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa Narcis Garcia
Aquesta proposta(2) té sentit, i de fet necessito incloure-ho en un 
programet ShellScript, però volia veure si podia evitar un bucle «for» 
utilitzant alguna comanda directa de grep, pcregrep o similar.


Gràcies.


El 17/1/24 a les 15:35, Xavier Drudis Ferran ha escrit:



El primer cas que demanaves sembla fàcil

grep -f fitxer_regexps.txt fitxer_nums.txt

Pel segon no sé cap comanda directa, potser alguna cosa tipus

#!/bin/bash
text=${1:-93123111}
fitxer_regexps=${2:-fitxer_regexps.txt}

for r in $(< "$fitxer_regexps") ; do {
grep -qE "$r" - <<< "$text" && echo "$r" ;
} ; done


Però això podria ser més eficient si t'ho programes el perl o python o
el que sigui...



--

Narcis Garcia

__
I'm using this dedicated address because personal addresses aren't 
masked enough at this mail public archive. Public archive administrator 
should remove and omit any @, dot and mailto combinations against 
automated addresses collectors.




Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa julio



El 17 de gener de 2024 8:39:26 CET, Narcis Garcia  ha 
escrit:
>Bones,
>
>Tinc un fitxer de text, com podria ser per exemple una llista de números de 
>telèfon (coneguts.txt):
>972123456
>97233
>97234
>97235
>97236
>972789012
>però m'agradaria representar-hi rangs compatibles (expressions regulars) per 
>abreviar:
>972123456
>972..
>972789012

Com no estem acotant amb ^  ni amb $ 


9
7
2
.
etcètera
97
72
21
9.
.9
etc
972
97.
9.2

I això sense fent servir només dígits i el caràcter . no literal.

Sembla un problema matemàtic de combinatòria :)

O probablement no ho he entès.

Vagi bé.


>En un moment donat, vull localitzar la línia que coincideixi amb la dada que 
>tinc (expressió 972123456), seguint l'exemple dels números de telèfon:
>$ grep coneguts.txt -e '972123456'
>972123456
>
>així que també m'agradaria fer-ho al revés; localitzar l'expressió compatible 
>amb una cadena:
>$ grep coneguts.txt -e '97299'
>972..
>
>Algú sap com fer-ho?
>
>Gràcies.
>

-
-- 
El 2003 el català era la llengua habitual del 46 % dels catalans. Al 2018 només 
del 36 %. Si els castellanoparlants no actuem, desapareixerà.

El 3 de novembre representa el moment de l'any en el que les dones deixen de 
cobrar en comparació amb els homes. Hem d’ajudar a les dones a eliminar aquesta 
data.

L’administració pública cada any es gasta milions d’euros en llicències de 
programari privatiu. Utilitzant programari lliure estalviem costos i incentivem 
l’economia local.

La neutralitat davant les desigualtats acaba accentuant-les.



Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa Xavier Drudis Ferran



El primer cas que demanaves sembla fàcil

grep -f fitxer_regexps.txt fitxer_nums.txt

Pel segon no sé cap comanda directa, potser alguna cosa tipus

#!/bin/bash
text=${1:-93123111}
fitxer_regexps=${2:-fitxer_regexps.txt}

for r in $(< "$fitxer_regexps") ; do {
   grep -qE "$r" - <<< "$text" && echo "$r" ;
} ; done


Però això podria ser més eficient si t'ho programes el perl o python o
el que sigui...



Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa Narcis Garcia

El 17/1/24 a les 12:10, jordi Perera ha escrit:

On 17-01-2024 8:39, Narcis Garcia wrote:

Bones,

Tinc un fitxer de text, com podria ser per exemple una llista de 
números de telèfon (coneguts.txt):

972123456
97233
97234
97235
97236
972789012
però m'agradaria representar-hi rangs compatibles (expressions 
regulars) per abreviar:

972123456
972..
972789012

En un moment donat, vull localitzar la línia que coincideixi amb la 
dada que tinc (expressió 972123456), seguint l'exemple dels números de 
telèfon:

$ grep coneguts.txt -e '972123456'
972123456

així que també m'agradaria fer-ho al revés; localitzar l'expressió 
compatible amb una cadena:

$ grep coneguts.txt -e '97299'
972..

Algú sap com fer-ho?

Gràcies.



això?

exemple buscar el que contingui un 34

grep -E '[0-9]?34[0-9]?' telefons.txt




No, seguint el teu exemple, voldria buscar per exemple amb quins patrons 
encaixaria un «34» de prefix:

3493000
3.93000
.493000
4493000
4.93000

Buscant un «34» inicial m'hauria de tornar les 3 primeres línies (el 
punt és comodí)


--
Narcis Garcia



Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa Narcis Garcia

El 17/1/24 a les 12:10, jordi Perera ha escrit:

On 17-01-2024 8:39, Narcis Garcia wrote:

Bones,

Tinc un fitxer de text, com podria ser per exemple una llista de 
números de telèfon (coneguts.txt):

972123456
97233
97234
97235
97236
972789012
però m'agradaria representar-hi rangs compatibles (expressions 
regulars) per abreviar:

972123456
972..
972789012

En un moment donat, vull localitzar la línia que coincideixi amb la 
dada que tinc (expressió 972123456), seguint l'exemple dels números de 
telèfon:

$ grep coneguts.txt -e '972123456'
972123456

així que també m'agradaria fer-ho al revés; localitzar l'expressió 
compatible amb una cadena:

$ grep coneguts.txt -e '97299'
972..

Algú sap com fer-ho?

Gràcies.



això?

exemple buscar el que contingui un 34

grep -E '[0-9]?34[0-9]?' telefons.txt




No, seguint el teu exemple, voldria buscar per exemple amb quins patrons 
encaixaria un «34» de prefix:

3493000
3.93000
.493000
4493000
4.93000

Buscant un «34» inicial m'hauria de tornar les 3 primeres línies (el 
punt és comodí)



--

Narcis Garcia

__
I'm using this dedicated address because personal addresses aren't 
masked enough at this mail public archive. Public archive administrator 
should remove and omit any @, dot and mailto combinations against 
automated addresses collectors.




Re: Filtrar comodins/regex de les línies

2024-01-17 Conversa jordi Perera

On 17-01-2024 8:39, Narcis Garcia wrote:

Bones,

Tinc un fitxer de text, com podria ser per exemple una llista de números 
de telèfon (coneguts.txt):

972123456
97233
97234
97235
97236
972789012
però m'agradaria representar-hi rangs compatibles (expressions regulars) 
per abreviar:

972123456
972..
972789012

En un moment donat, vull localitzar la línia que coincideixi amb la dada 
que tinc (expressió 972123456), seguint l'exemple dels números de telèfon:

$ grep coneguts.txt -e '972123456'
972123456

així que també m'agradaria fer-ho al revés; localitzar l'expressió 
compatible amb una cadena:

$ grep coneguts.txt -e '97299'
972..

Algú sap com fer-ho?

Gràcies.



això?

exemple buscar el que contingui un 34

grep -E '[0-9]?34[0-9]?' telefons.txt


--
Jordi Perera