Mi spiegate questo? {%;*}

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
fiamma
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 256
Iscrizione: lunedì 31 marzo 2008, 21:05

Mi spiegate questo? {%;*}

Messaggio da fiamma »

Girando per la rete ho trovato questo:

line=’this “is” a command;this “is” a pattern’
COMMAND=${line%;*}
PATTERN=${line#*;}
echo $COMMAND
echo $PATTERN

this “is” a command
this “is” a pattern

Potreste gentilmente spiegarmi il suo funzionamento?
Sapere come mai % e # influiscono in quel modo.
L'asterisco "trova le stringhe che contengono quante si vuole (anche zero) occorrenze del carattere precedente". Qui sembra che oltre a trovare, cancelli anche.

Grazie
Avatar utente
takeshi
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 789
Iscrizione: venerdì 24 novembre 2006, 18:33

Re: Mi spiegate questo? {%;*}

Messaggio da takeshi »

Sono "comandi" interni di bash:

${var#pattern} rimuove pattern (se presente) dall'inizio di var e ritorna la stringa risultante
${var%pattern} fa la stessa cosa ma pattern viene tolto se è presente alla fine.

Esempio:

Codice: Seleziona tutto

var="esempiopippoesempio"
echo ${var#esempio}
pippoesempio
echo ${var%esempio}
esempiopippo
In bash l'asterisco ha un significato leggermente differente rispetto a quello delle espressioni regolari. Infatti significa qualsiasi stringa (compresa quella nulla).

Talvolta si usano le versioni "ghiotte" di #/% cioé ## e %% per togliere tutto il possibile. Per esempio:

Codice: Seleziona tutto

file=/full/path/pippo
echo ${file##*/}
Per maggiori info: http://www.pluto.it/files/ildp/guide/ab ... l#AEN19192
Raising Elephants Is So Utterly Boring
Avatar utente
fiamma
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 256
Iscrizione: lunedì 31 marzo 2008, 21:05

Re: Mi spiegate questo? {%;*}

Messaggio da fiamma »

Se per esempio dentro a un file di testo ho cinque esempiopippoesempio e cinque provaplutoprova scritti in ordine sparso e voglia prelevare solo la parte "plutoprova" da tutte e cinque le sue  righe (quindi ritrovarmi plutoprova stampato per cinque volte), con un ciclo for come dovrei impostarte il comando?
Avatar utente
takeshi
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 789
Iscrizione: venerdì 24 novembre 2006, 18:33

Re: Mi spiegate questo? {%;*}

Messaggio da takeshi »

In bash puoi fare così:

Codice: Seleziona tutto

while read line; do
    if [ "$line" = "provaplutoprova" ]; then
         echo ${line#prova};
done <file
Per i casi reali, con file e pattern non semplici, è meglio ( = più performante, leggibile, etc. ) usare sed/awk:

Codice: Seleziona tutto

sed -n 's/prova\(plutoprova\)/\1/p' file
oppure

Codice: Seleziona tutto

awk '/provaplutoprova/{print "plutoprova"} file'
Per fare una prova, ho creato un file di 100000 di righe e l'ho dato in pasto ai comandi qui sopra; questo sono i tempi di esecuzione:

bash 19.373s
sed 1.071s
awk 0.817s
Raising Elephants Is So Utterly Boring
Avatar utente
fiamma
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 256
Iscrizione: lunedì 31 marzo 2008, 21:05

Re: Mi spiegate questo? {%;*}

Messaggio da fiamma »

Grazie, vedrò di lavorarci sù.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti