Script: Ricerca di sottostringa dentro una stringa

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
rigoletto
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 386
Iscrizione: domenica 14 settembre 2008, 23:20
Località: Valderice

Script: Ricerca di sottostringa dentro una stringa

Messaggio da rigoletto »

Ho cercato come potere riscontrare la presenza di una sottostringa all'interno di una stringa nel mio attuale script bash.
Ho trovato questo
Visto che mi è sembrato più facile da usare rispetto al metodo con "grep", ho provato allora a metterlo in pratica nel mio script:

Codice: Seleziona tutto

for ((ix=1;ix<4;++ix)); do
        if [[ $Tbuuiddest[ix] == *"al:"* ]]; then 
            echo "Ricerca positiva"        
            lun=${#Tbuuiddest[ix]}
            ixData=$(( lun - 7 ))
            echo "ixdata= ${ixData}"
            echo -n "Tbuuiddest[${ix}]= ${Tbuuiddest[ix]}"; echo "data Ult.Salv.: $Tbuuiddest[${ix}:${ixdata}:8]"
        else
            echo "Ricerca negativa"        
        fi
    done
Ma purtroppo non mi funziona. Infatti, pur essendo presente la sottostringa "al:", la risposta fornita in esecuzione è sempre "Ricerca negativa"
Tbuuiddest[1]= 1a94d130-5809-4294-bff2-ef66b253a661 al:20260802
Tbuuiddest[2]= b269b093-f3bd-4820-9a48-70e3f4144eb8 al:20260803
Tbuuiddest[3]= 10463104-03e8-412e-8ce7-43288d44221b al:20260706
e premi 'INVIO' per proseguire
Ricerca negativa
Ricerca negativa
Ricerca negativa
Io credo di avere rispettato le indicazioni fornite nella guida. Non capisco perciò perchè non debba funzionare mai.

Perchè?
:ciao: (avevo una volta -> Ubuntu 22.04 LTS)
Avatar utente
cobra90nj
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 338
Iscrizione: venerdì 27 luglio 2007, 1:34
Località: NeT

Re: Script: Ricerca di sottostringa dentro una stringa

Messaggio da cobra90nj »

Codice: Seleziona tutto

$Tbuuiddest[${ix}:${ixdata}:8]
il nome della variabile è sbagliato, e la sintassi corretta per estrarre una sottostringa è:

Codice: Seleziona tutto

${nome_array[indice]:posizione:lunghezza}
Avatar utente
rigoletto
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 386
Iscrizione: domenica 14 settembre 2008, 23:20
Località: Valderice

Re: Script: Ricerca di sottostringa dentro una stringa

Messaggio da rigoletto »

cobra90nj ha scritto:
sabato 15 agosto 2026, 16:53

Codice: Seleziona tutto

$Tbuuiddest[${ix}:${ixdata}:8]
il nome della variabile è sbagliato, e la sintassi corretta per estrarre una sottostringa è:

Codice: Seleziona tutto

${nome_array[indice]:posizione:lunghezza}
Scusa cobra90nj, ma l'struzione a cui ti stai riferendo, è la seguente:

Codice: Seleziona tutto

echo -n "Tbuuiddest[${ix}]= ${Tbuuiddest[ix]}"; echo "data Ult.Salv.: $Tbuuiddest[${ix}:${ixdata}:8]"
mentre quella che non funziona e che dovrebbe produrre la ricerca del termine "al:" all'interno di $Tbuuiddest[ix] è:

Codice: Seleziona tutto

if [[ $Tbuuiddest[ix] == *"al:"* ]]; then
Comunque, ho provato anche con sed e con grep, ma riesco ad andare avanti. L'esito è sempre Ricerca negativa.
Sicuramente sbaglio qualcosa, ma non capisco cosa.
:ciao: (avevo una volta -> Ubuntu 22.04 LTS)
Avatar utente
cobra90nj
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 338
Iscrizione: venerdì 27 luglio 2007, 1:34
Località: NeT

Re: Script: Ricerca di sottostringa dentro una stringa

Messaggio da cobra90nj »

Io non avevo detto di aver corretto tutto, ma mi era andato nell'occhio quell'errore ed ho postato troppo in fretta, hai ragione, stavo dal tel. ora questo altro errore, semplicemente per "estendere" un array o per meglio dire accedere ad un suo elemento, devi mettere la variabile tra parentesi graffe, quindi, lo script corretto è:

Codice: Seleziona tutto

for ((ix=1;ix<4;++ix)); do
    if [[ ${Tbuuiddest[ix]} == *"al:"* ]]; then 
        echo "Ricerca positiva"        
        lun=${#Tbuuiddest[ix]}
        ixData=$(( lun - 7 ))
        echo "ixdata= ${ixData}"
        echo -n "Tbuuiddest[${ix}]= ${Tbuuiddest[ix]} "; echo "data Ult.Salv.: ${Tbuuiddest[ix]:ixData:8}"
    else
        echo "Ricerca negativa"        
    fi
done
Ricorda che bash è Case-Sensitivity quindi c'è distinzione tra minuscole è maiuscole.
Ti consiglio di installare shellcheck da apt, così per avere una panoramica degli errori di questo tipo, lo lanci da terminale: shellcheck tuo_script_nome.sh esiste anche una versione online.

https://www.shellcheck.net/
https://www.html.it/pag/52069/array-2/
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2929
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Script: Ricerca di sottostringa dentro una stringa

Messaggio da rai »

rigoletto ha scritto:
sabato 15 agosto 2026, 15:05
Visto che mi è sembrato più facile da usare rispetto al metodo con "grep", ho provato allora a metterlo in pratica nel mio script:
In realtà con grep è molto più semplice e più efficiente. La parola magica è l'opzione di grep -o che serve per estrarre, invece che tutto il rigo, soltanto la parte che corrisponde alla tua ricerca. Ricerca che si può fare in vari modi visto che [pare di capire che] hai il controllo su come si formano le stringhe all'interno delle quali poi cerchi la data.
Per esempio:

Codice: Seleziona tutto

#! /bin/bash

Tbuuiddest=(
"1a94d130-5809-4294-bff2-ef66b253a661 al:20260802"
"b269b093-f3bd-4820-9a48-70e3f4144eb8 nel:20260803"
"10463104-03e8-412e-8ce7-43288d44221b il:20260706"
)

for Tb in "${Tbuuiddest[@]}"; do
    date=$(grep -Po '(?<=al:).+' <<<${Tb}) # questo prende solo le date precedute da "al:"
    #date=$(grep -Po '\d+$' <<<${Tb}) # questo prende tutte le date finali
    if [ -z $date ]; then
        echo "Ricerca negativa"
    else
        echo "Ricerca positiva="
        echo "${Tb} data Ult.Salv.: $(date -d $date)"
    fi
done
l'esecuzione del precedente codice da questo output

Codice: Seleziona tutto

Ricerca positiva=
1a94d130-5809-4294-bff2-ef66b253a661 al:20260802 data Ult.Salv.: dom 2 ago 2026, 00:00:00, CEST
Ricerca negativa
Ricerca negativa
Avatar utente
rigoletto
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 386
Iscrizione: domenica 14 settembre 2008, 23:20
Località: Valderice

Re: Script: Ricerca di sottostringa dentro una stringa

Messaggio da rigoletto »

cobra90nj ha scritto:
sabato 15 agosto 2026, 19:07
. . .
per "estendere" un array o per meglio dire accedere ad un suo elemento, devi mettere la variabile tra parentesi graffe, quindi, lo script corretto è:

Codice: Seleziona tutto

for ((ix=1;ix<4;++ix)); do
    if [[ ${Tbuuiddest[ix]} == *"al:"* ]]; then 
        echo "Ricerca positiva"        
        lun=${#Tbuuiddest[ix]}
        ixData=$(( lun - 7 ))
        echo "ixdata= ${ixData}"
        echo -n "Tbuuiddest[${ix}]= ${Tbuuiddest[ix]} "; echo "data Ult.Salv.: ${Tbuuiddest[ix]:ixData:8}"
    else
        echo "Ricerca negativa"        
    fi
done
Ho capito, grazie.
Ecco la correzione, dopo attenta revisione:

Codice: Seleziona tutto

  parola=" al: "
  for ((ix=1;ix<4;++ix)); do
        lun=${#Tbuuiddest[ix]}
        ixData=$(( lun - 8 ))
        if [[ ${Tbuuiddest[ix]} == *${parola}* ]]; then
            echo "Ricerca positiva"        
            lun=${#Tbuuiddest[ix]}
            ixData=$(( lun - 8 ))
            echo "lun= ${lun}"
            echo "ixdata= ${ixData}"
            echo -n "Tbuuiddest[${ix}]= ${Tbuuiddest[ix]}"; echo " - data Ult.Salv.= ${Tbuuiddest[ix]:ixdata:8}"
        else
            echo "Ricerca negativa"        
        fi
    done
    exit
Tuttavia NON funziona:
Tbuuiddest[1]= ^1a94d130-5809-4294-bff2-ef66b253a661 al: 20260802^
Tbuuiddest[2]= ^b269b093-f3bd-4820-9a48-70e3f4144eb8 al: 20260803^
Tbuuiddest[3]= ^10463104-03e8-412e-8ce7-43288d44221b al: 20260706^
premi 'INVIO' per proseguire
parola= | al: |
Ricerca positiva
lun= 49
ixdata= 41
Tbuuiddest[1]= 1a94d130-5809-4294-bff2-ef66b253a661 al: 20260802 - data Ult.Salv.= 1a94d130
Ricerca positiva
lun= 49
ixdata= 41
Tbuuiddest[2]= b269b093-f3bd-4820-9a48-70e3f4144eb8 al: 20260803 - data Ult.Salv.= b269b093
Ricerca positiva
lun= 49
ixdata= 41
Tbuuiddest[3]= 10463104-03e8-412e-8ce7-43288d44221b al: 20260706 - data Ult.Salv.= 10463104
Come puoi vedere, al posto della data che si trova in fondo a ciascun elemento dell'array, vengono estratti i primi 8 caratteri di ogni elemento.

Francamente, non capisco. Eppure il metodo l'ho già applicato, e con soddisfazione, per estrarre dati da una stringa.
:ciao: (avevo una volta -> Ubuntu 22.04 LTS)
Avatar utente
rigoletto
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 386
Iscrizione: domenica 14 settembre 2008, 23:20
Località: Valderice

Re: Script: Ricerca di sottostringa dentro una stringa

Messaggio da rigoletto »

rai ha scritto:
domenica 16 agosto 2026, 16:38
In realtà con grep è molto più semplice e più efficiente. La parola magica è l'opzione di grep -o che serve per estrarre, invece che tutto il rigo, soltanto la parte che corrisponde alla tua ricerca.
Mi viene difficile pensare al metodo grep, perchè non l'ho ancora capito. E' vero che utilizzo gli script molto raramente e solamente per le mie necessità pratiche di gestione dei "ati miei". Ciò non mi ha permesso di approfondire le conoscenze su grep e non solo.

Però, se non riesco ad andare avanti diversamente, dovrò fare tesoro del tuo consiglio. Grazie.
:ciao: (avevo una volta -> Ubuntu 22.04 LTS)
Avatar utente
cobra90nj
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 338
Iscrizione: venerdì 27 luglio 2007, 1:34
Località: NeT

Re: Script: Ricerca di sottostringa dentro una stringa

Messaggio da cobra90nj »

se il problema è estrarre gli ultimi 8 caratteri allora prova:

Codice: Seleziona tutto

echo " - data Ult.Salv.= ${Tbuuiddest[ix]: -8}"
edit:

Codice: Seleziona tutto

#!/bin/bash

Tbuuiddest=(
    "1a94d130-5809-4294-bff2-ef66b253a661 al:20260802"
    "b269b093-f3bd-4820-9a48-70e3f4144eb8 nel:20260803"
    "10463104-03e8-412e-8ce7-43288d44221b il:20260706"
)

parola=" al:"

for ((ix=0; ix<3; ++ix)); do
    if [[ ${Tbuuiddest[ix]} == *"${parola}"* ]]; then
        echo "Ricerca positiva"        
        
        lun=${#Tbuuiddest[ix]}
        ixdata=$(( lun - 8 ))
        
        echo "lun= ${lun}"
        echo "ixdata= ${ixdata}"
        echo -n "Tbuuiddest[${ix}]= ${Tbuuiddest[ix]}"
        echo " - data Ult.Salv.= ${Tbuuiddest[ix]:ixdata:8}"
    else
        echo "Ricerca negativa"        
    fi
done
exit
oppure come dicevo:

Codice: Seleziona tutto

#!/bin/bash

Tbuuiddest=(
    "1a94d130-5809-4294-bff2-ef66b253a661 al:20260802"
    "b269b093-f3bd-4820-9a48-70e3f4144eb8 nel:20260803"
    "10463104-03e8-412e-8ce7-43288d44221b il:20260706"
)

parola=" al:"

for ((ix=0; ix<3; ++ix)); do
    if [[ ${Tbuuiddest[ix]} == *"${parola}"* ]]; then
        echo "Ricerca positiva"        
        echo -n "Tbuuiddest[${ix}]= ${Tbuuiddest[ix]}"
        echo " - data Ult.Salv.= ${Tbuuiddest[ix]: -8}"
    else
        echo "Ricerca negativa"        
    fi
done
exit

edit2:
ricorda che gli array si contano da 0, ma se vuoi fare come il tuo esempio allora:

Codice: Seleziona tutto

#!/bin/bash
Tbuuiddest=(
    "" # Indice 0 vuoto, dato che il ciclo parte da 1
    "1a94d130-5809-4294-bff2-ef66b253a661 al: 20260802"
    "b269b093-f3bd-4820-9a48-70e3f4144eb8 al: 20260803"
    "10463104-03e8-412e-8ce7-43288d44221b al: 20260706"
)

parola=" al: "

for ((ix=1; ix<4; ++ix)); do
    if [[ ${Tbuuiddest[ix]} == *"${parola}"* ]]; then
        echo "Ricerca positiva"
        echo -n "Tbuuiddest[${ix}]= ${Tbuuiddest[ix]}"
        
        echo " - data Ult.Salv.= ${Tbuuiddest[ix]: -8}"
    else
        echo "Ricerca negativa"
    fi
done
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2929
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Script: Ricerca di sottostringa dentro una stringa

Messaggio da rai »

@rigoletto qui si va un po' a indovinare per aiutarti perché non ha mai postato _tutto_ il listato del tuo script e delle stringhe su cui deve fare la ricerca: solo frammenti del codice e frammenti dell'output, non correlabili tra loro da quello che si è letto fino a ora.
Inoltre siamo passati da un iniziale
la risposta fornita in esecuzione è sempre "Ricerca negativa"
a un
al posto della data che si trova in fondo a ciascun elemento dell'array, vengono estratti i primi 8 caratteri di ogni elemento.
che ha ovviamente una causa differente

Secondo me questo sistema di slicing delle stringhe per estrarne una substringa è una masochistica complicazione visto che si può lasciarlo fare a tool specializzati in queste cose (grep, awk, ...)
Comunque se uno vuole insistere, almeno vediamo qual è il codice attuale seguito subito dall' output della sua esecuzione, non una loro sintesi.
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 639
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu24@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: Script: Ricerca di sottostringa dentro una stringa

Messaggio da Lucio C »

Non leggo ne' scrivo bash in quanto uso (t)csh come shell preferito per i miei script (sintassi C-like piu' semplice), ma concordo che awk o grep sarebbero i tool migllori per string processing. Li si puo' tranquillamente chiamare anche da uno script (e' lo spirito Unix-Linux) ... in awk si possono addirittura scrivere interi script.

Se il senso e' solo di verificare la presenza di una sottostringa in posizione arbitraria in una stringa, grep -q poi testando $status e' sufficiente. p.es. (da terminale)

Codice: Seleziona tutto

set a = "pincopanco"
echo $a | grep -q pinco
echo $status
echo $a | grep -q pongo
echo $status
Il primo ritorna status=0 (trovato) e il secondo status=1 (non trovato).
In awk la funzione da usare per verificare la solo presenza di una sottostringa e' index, Sempre da terminale e alla rovescia dell'esempio precedente (sottostringa fissa, stringa variabile)

Codice: Seleziona tutto

awk -e '{print index($1,"panco")}'
pincopanco
6		
pancopinco
1
tiziocaio
0
index ritorna la posizione dell'inizio della sottostringa, o zero se non la trova
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
Avatar utente
rigoletto
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 386
Iscrizione: domenica 14 settembre 2008, 23:20
Località: Valderice

Re: Script: Ricerca di sottostringa dentro una stringa

Messaggio da rigoletto »

cobra90nj ha scritto:
domenica 16 agosto 2026, 19:09
se il problema è estrarre gli ultimi 8 caratteri allora prova:

Codice: Seleziona tutto

echo " - data Ult.Salv.= ${Tbuuiddest[ix]: -8}"
Grazie, l'ho provato, ma aveov commesso un errore sintattico , senza accorgermene.

Codice: Seleziona tutto

 read -p "premi 'INVIO' per proseguire"    # lopzione -p attiva la ATTESA operatore' ed il sistema attendela pressione del tasto |INVIO|
 echo "parola= |$parola|"
 for ((ix=1;ix<4;++ix)); do
        lun=${#Tbuuiddest[ix]}
        ixData=$(( lun - 8 ))
        if [[ ${Tbuuiddest[ix]} == *${parola}* ]]; then
            echo "Ricerca positiva"        
            lun=${#Tbuuiddest[ix]}
            ixData=$(( lun - 8 ))
            echo "lun= ${lun}"
            echo "ixdata= ${ixData}"
            echo -n "Tbuuiddest[${ix}]= ${Tbuuiddest[ix]}"; echo " - data Ult.Salv.= ${Tbuuiddest[ix]: -8}"
        else
            echo "Ricerca negativa"        
        fi
    done
Ecco il risultato:
premi 'INVIO' per proseguire
parola= | al: |
Ricerca positiva
lun= 49
ixdata= 41
Tbuuiddest[1]= 1a94d130-5809-4294-bff2-ef66b253a661 al: 20260802 - data Ult.Salv.= 20260802
Ricerca positiva
lun= 49
ixdata= 41
Tbuuiddest[2]= b269b093-f3bd-4820-9a48-70e3f4144eb8 al: 20260803 - data Ult.Salv.= 20260803
Ricerca positiva
lun= 49
ixdata= 41
Tbuuiddest[3]= 10463104-03e8-412e-8ce7-43288d44221b al: 20260706 - data Ult.Salv.= 20260706
Per ora ho risolto con: ^echo " - data Ult.Salv.= ${Tbuuiddest[ix]: -8}"^.
:ciao: (avevo una volta -> Ubuntu 22.04 LTS)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 1 ospite