Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Perl, bash, o entrambi?

0 views
Skip to first unread message

[devnull]

unread,
Jul 17, 2008, 1:05:39 PM7/17/08
to
Ciao a tutti,
premetto che conosco lo scripting bash ma per niente il Perl. Sto
provando a farci qualcosina ma sono proprio un newbie.

Avrei questo problema.

Ho un file contenente varie righe, ad esempio:

prova1
ciao2
perl8
ciao5
perl2
prova9

Ora, vorrei copiare il contenuto di questo file in un nuovo file, dove
le righe che contengono ciaoX saranno sostituite con ciaoX+1

Il nuovo file sarà quindi:

prova1
ciao3
perl8
ciao6
perl2
prova9

Qualcuno sa come è possibile fare una cosa del genere? Che io sappia
con la sola bash non è possibile.. almeno non con "sed". Con "awk" non
ci riesco.. c'è qualche modo di farlo in perl?

Grazie!

antani

unread,
Jul 17, 2008, 1:47:45 PM7/17/08
to

perl -pe 's/(?<=^ciao)(\d+)$/$1+1/e' file

o, senza usare lookbehind,

perl -pe 's/^ciao(\d+)$/sprintf "ciao%d",$1+1/e' file

o (con Perl 5.10)

perl -pe 's/^ciao\K(\d+)$/$1+1/e' file

Con vari gradi di masochismo, si puo' anche fare con awk o con sed (ma solo
se proprio ci si vuole molto male!)

[devnull]

unread,
Jul 17, 2008, 1:54:48 PM7/17/08
to
On 17 Lug, 19:47, antani <ant...@mail.not> wrote:
>
> perl -pe 's/(?<=^ciao)(\d+)$/$1+1/e' file
>
> o, senza usare lookbehind,
>
> perl -pe 's/^ciao(\d+)$/sprintf "ciao%d",$1+1/e' file
>
> o (con Perl 5.10)
>
> perl -pe 's/^ciao\K(\d+)$/$1+1/e' file
>
> Con vari gradi di masochismo, si puo' anche fare con awk o con sed (ma solo
> se proprio ci si vuole molto male!)


Intanto grazie mille, funziona perfettamente!
Ma avrei qualche difficoltà nel capirne il funzionamento...
Tanto per cercare di comprendere meglio come funziona se mi dovesse
servire nuovamente:

se ad esempio dovessi cambiare invece che la variabile dopo la parola
la variabile che precede la parola?

esempio:

1ciao

dovrebbe diventare

2ciao

Ci stavo provando ma proprio non ne vengo fuori...

Grazie ancora!

antani

unread,
Jul 17, 2008, 2:02:34 PM7/17/08
to
On Thursday 17 July 2008 19:54, [devnull] wrote:

> se ad esempio dovessi cambiare invece che la variabile dopo la parola
> la variabile che precede la parola?
>
> esempio:
>
> 1ciao
>
> dovrebbe diventare
>
> 2ciao

E' lo stesso principio:

perl -pe 's/^(\d+)(?=ciao$)/$1+1/e' file
perl -pe 's/^(\d+)ciao$/sprintf "%dciao",$1+1/e' file

(\K non e' applicabile qui)


Emanuele Zeppieri

unread,
Jul 17, 2008, 2:04:01 PM7/17/08
to
[devnull] wrote:

Mi accodo ad Antani:

$ perl -pe 's/(ciao)(\d+)/$1.($2+1)/e' < inputfile.txt > newfile.txt

(questa versione modifica la stringa "ciaoX" (la prima da sinistra, nel
caso ce ne fossero più di una su una stessa riga) anche se compare dopo
l'inizio riga).

Come vedi è fatto tutto dalla command line (come gli esempi di Antani
del resto).
Un po' di tempo su Perl è tra i migliori investimenti che si possano
fare (de 'sti tempi poi ;-)

Ciao!

[devnull]

unread,
Jul 17, 2008, 2:12:37 PM7/17/08
to
On 17 Lug, 20:02, antani <ant...@mail.not> wrote:
>
> E' lo stesso principio:
>
> perl -pe 's/^(\d+)(?=ciao$)/$1+1/e' file

Stupidamente avevo lasciato il <

Grazie!

[devnull]

unread,
Jul 17, 2008, 2:14:10 PM7/17/08
to
On 17 Lug, 20:04, Emanuele Zeppieri
<ema...@tiscali.itsnip_here.invalid> wrote:

> Un po' di tempo su Perl è tra i migliori investimenti che si possano
> fare (de 'sti tempi poi ;-)
>
> Ciao!

Si.. infatti ho notato che ci si può fare di tutto.. ho iniziato a
leggermi qualcosina ma lo trovo un bel pò ostico!
Spero un pò alla volta di entrare nella giusta mentalità :)

Grazie e ciao!

Emanuele Zeppieri

unread,
Jul 17, 2008, 7:34:24 PM7/17/08
to
[devnull] wrote:

> On 17 Lug, 20:04, Emanuele Zeppieri
> <ema...@tiscali.itsnip_here.invalid> wrote:
>
>> Un po' di tempo su Perl è tra i migliori investimenti che si possano
>> fare (de 'sti tempi poi ;-)
>>
>> Ciao!
>
> Si.. infatti ho notato che ci si può fare di tutto.. ho iniziato a
> leggermi qualcosina ma lo trovo un bel pò ostico!

Considera anche che sei partito proprio con le cose più complicate, o
quantomeno le più /peculiari/ (le regex).

> Spero un pò alla volta di entrare nella giusta mentalità :)

Sicuramente. Diverrà tutto familiare, molto più velocemente di quanto
all'inizio si possa immaginare.

Ma tieni anche presente che Perl permette di scrivere codice molto più
leggibile e /tradizionale/, e/o completamente OO (addirittura con
first-class objects), senza alcun obbligo di rincorrere la compattezza a
tutti i costi (è solo che poi si perde gran parte del divertimento ;-)

Ciao!

0 new messages