[Risolto]script bash sostituzione lettere/numeri

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
tigerwalk1
Prode Principiante
Messaggi: 12
Iscrizione: sabato 15 gennaio 2022, 12:37
Desktop: Cinnamon
Distribuzione: Linux Mint 20.3
Sesso: Maschile

[Risolto]script bash sostituzione lettere/numeri

Messaggio da tigerwalk1 »

Salve a tutti, avrei bisogno di uno script (purtroppo non sono capace a farmelo da solo) che mi cambiasse il nome di un file sostituendo le lettere con dei numeri, come di seguito:

Codice: Seleziona tutto

a=1
b=2
c=3
d=4
e=5
f=6
g=7
h=8
i=10
j=11
k=12
l=13
m=14
n=15
o=16
p=17
q=18
r=19
s=20
t=21
u=22
x=23
y=24
w=25
z=26
Qualcuno potrebbe essere così gentile da postarmelo?
Grazie
Ultima modifica di tigerwalk1 il domenica 16 gennaio 2022, 19:43, modificato 3 volte in totale.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: script bash sostituzione lettere/numeri

Messaggio da vaeVictis »

Ciao.
Un primo consiglio: usa il tag per il codice quando scrivi tutte quelle righe. Sarebbe opportuno che modificassi proprio il tuo messaggio: clicca sul bottone con la matita in alto a destra nel frame del tuo messaggio, e vedrai che ti si apre l'editor; ora, evidenzia tutte le righe con lettere e numeri e poi clicca sul bottone con </> proprio sopra all'editor.

Detto questo, l'unico problema è come distinguere un numero, per esempio 1, quando compare da solo o come decina di un altro numero.
Pertanto la domanda è: questi numeri ti possono comparire in modo "casuale" nel nome del file? Posta qualche esempio di nome di file che vuoi convertire.

Edit:
La risposta si riferisce alla prima versione della domanda dell'OP, in cui erano i numeri a dover essere tradotti in lettera.
Ultima modifica di vaeVictis il domenica 16 gennaio 2022, 8:28, modificato 1 volta in totale.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1703
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: script bash sostituzione lettere/numeri

Messaggio da korda »

vaeVictis ha scritto:
sabato 15 gennaio 2022, 18:18
Detto questo, l'unico problema è come distinguere un numero, per esempio 1, quando compare da solo o come decina di un altro numero.
In realtà è un non problema, se riportassi tutti i numeri a due cifre (ad es. 01, 02, 10, 21,...) e campionassi la stringa ottenuta per coppie di caratteri
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: script bash sostituzione lettere/numeri

Messaggio da Lucio C »

Se fosse stata SOLO la sostituzione di una lettera [a-z] ciascuna con un singolo altro carattere si sarebbe potuto usare il comando tr.

In ogni caso io lo so fare in csh/tcsh (la conversione del loop a bash e' lasciata come esercizio al lettore ... oppure nessuno vieta di usare csh temporaneamente :p), usando sed. L'esempio sotto e' stato testato dal vivo sulle lettere abcd (si lascia il completamento al lettore).

Codice: Seleziona tutto

foreach  i (*)
 set a = `echo $i | sed -e 's/a/1/g' -e 's/b/2/g' -e 's/c/3/g' -e 's/d/4/g'    etc. etc. etc.  -e 's/z/26/g'`
 echo mv $i $a
end
Rimuovere il comando echo alla terza riga per eseguirlo dal vero, come e' scritto fa solo vedere il comando che eseguirebbe (che e' un utile trucco per testare la procedura prima di eseguirla). Occhio alla differenza tra quotes e backquotes !
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)
tigerwalk1
Prode Principiante
Messaggi: 12
Iscrizione: sabato 15 gennaio 2022, 12:37
Desktop: Cinnamon
Distribuzione: Linux Mint 20.3
Sesso: Maschile

Re: script bash sostituzione lettere/numeri

Messaggio da tigerwalk1 »

Grazie per la vostra attenzione. Da ieri, stò cercando di tirare fuori qualcosa utilizzando i suggerimenti di cui sopra. E' difficile per me che sono completamente a digiuno della cosa, devo trovare il modo di trasformare quello script postatomi in una forma che bash possa utilizzare. Difficile ma, non dispero.
[Edit] ho provato così:

Codice: Seleziona tutto

#!/bin/bash

for file in *\ *; do
  mv "$file" "${file echo $i | sed -e 's/a/1°/g' -e 's/b/2°/g' -e 's/c/3°/g' -e 's/d/4°/g' -e 's/e/5°/g' -e 's/f/6°/g' -e 's/g/7°/g' -e 's/h/8°/g' -e 's/i/9°/g' -e 's/j/10°/g' -e 's/k/11°/g' -e 's/l/12°/g' -e 's/m/13°/g' -e 's/n/14°/g' -e 's/o/15°/g' -e 's/p/16°/g' -e 's/q/17°/g' -e 's/r/18°/g' -e 's/s/19°/g' -e 's/t/20°/g' -e 's/u/21°/g' -e 's/v/22°/g' -e 's/x/23°/g' -e 's/y/24°/g' -e 's/w/25°/g'  -e 's/z/26°/g'}"
done
Ma la shell dice:

Codice: Seleziona tutto

tigerwalk@tigerwalk-Lenovo-ideapad-110-15ISK:~/pwd$ ./lettere_numeri.sh 
./lettere_numeri.sh: riga 4: ${file echo $i | sed -e 's/a/1°/g' -e 's/b/2°/g' -e 's/c/3°/g' -e 's/d/4°/g' -e 's/e/5°/g' -e 's/f/6°/g' -e 's/g/7°/g' -e 's/h/8°/g' -e 's/i/9°/g' -e 's/j/10°/g' -e 's/k/11°/g' -e 's/l/12°/g' -e 's/m/13°/g' -e 's/n/14°/g' -e 's/o/15°/g' -e 's/p/16°/g' -e 's/q/17°/g' -e 's/r/18°/g' -e 's/s/19°/g' -e 's/t/20°/g' -e 's/u/21°/g' -e 's/v/22°/g' -e 's/x/23°/g' -e 's/y/24°/g' -e 's/w/25°/g'  -e 's/z/26°/g'}: sostituzione errata
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: script bash sostituzione lettere/numeri

Messaggio da Lucio C »

Non conosco la sintassi di bash, ma come dicevo nulla vieta di far girare il mio esempio invocando temporameamente (t)csh o creando uno script che giri in (t)csh ... basta mettere la shebang di (t)csh nella prima riga al posto di quella di bash. Inoltre suggerisco di provare la cosa per gradi, p.es. provando con una o due lettere alla volta, e facendo vedere il comando che eseguirebbe (con echo) invece di tentare subito di eseguirlo, oppure pipando un ls nel comando sed. Inoltre non disprezzerei l'uso di variabili temporanee.

Infine non capisco cosa sia nei comandi sed quello che a me appare come un segno di "grado" che evidenzio in rosso qui sotto
sed -e 's/a/1°/g'
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)
tigerwalk1
Prode Principiante
Messaggi: 12
Iscrizione: sabato 15 gennaio 2022, 12:37
Desktop: Cinnamon
Distribuzione: Linux Mint 20.3
Sesso: Maschile

Re: script bash sostituzione lettere/numeri

Messaggio da tigerwalk1 »

Lucio C ha scritto:
domenica 16 gennaio 2022, 13:41
........................................................................................
Infine non capisco cosa sia nei comandi sed quello che a me appare come un segno di "grado" che evidenzio in rosso qui sotto
sed -e 's/a/1°/g'
il segno che ho introdotto ossia [°] mi servirebbe a non confondere ad es, un 1 con un 11 se magari la a è un 1 ed è seguita da una j che è la 11

Codice: Seleziona tutto

Inoltre non disprezzerei l'uso di variabili temporanee.
Magari sapessi come fare........
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: script bash sostituzione lettere/numeri

Messaggio da Lucio C »

Per le variabili ... leggere man bash (o trovare qualche tutorial) ... o farlo in csh (dove le variabili si assegnano con set var = e si richiamano con $var, come da mio esempio ... testato e funzionante)
Per il segno di grado non vorrei creasse problema a sed ... io mi attengo sempre al puro ASCII (man ascii) ... magari i meno comuni tipo @ # _ ... nei rari casi in cui mi occorre un separatore

... a parte che non ho capito il senso della trasformazione se non come "esercizio scolastico", deve essere reversibile ? Allora sarebbe meglio usare lettera in due cifre, p.es. sed -e 's/a/01/g' etc. fino a 09

PS e' meglio usare quote non code per citare parti di testo (il bottone prima)
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)
tigerwalk1
Prode Principiante
Messaggi: 12
Iscrizione: sabato 15 gennaio 2022, 12:37
Desktop: Cinnamon
Distribuzione: Linux Mint 20.3
Sesso: Maschile

Re: script bash sostituzione lettere/numeri

Messaggio da tigerwalk1 »

Lucio C ha scritto:
domenica 16 gennaio 2022, 16:05
Per le variabili ... leggere man bash (o trovare qualche tutorial) ... o farlo in csh (dove le variabili si assegnano con set var = e si richiamano con $var, come da mio esempio ... testato e funzionante)
Per il segno di grado non vorrei creasse problema a sed ... io mi attengo sempre al puro ASCII (man ascii) ... magari i meno comuni tipo @ # _ ... nei rari casi in cui mi occorre un separatore

... a parte che non ho capito il senso della trasformazione se non come "esercizio scolastico", deve essere reversibile ? Allora sarebbe meglio usare lettera in due cifre, p.es. sed -e 's/a/01/g' etc. fino a 09

PS e' meglio usare quote non code per citare parti di testo (il bottone prima)
Da due giorni, ho iniziato a leggere http://codex.altervista.org/guidabash/g ... h_1_11.pdf. Usare lettere in due cifre non mi metterebbe al riparo, in fase di "reversibilità" da possibili interpretazioni errate ad es. aj, verrebbe "tradotto" in 111, in fase inversa, potrebbe essere aj ma anche ja. Nel caso, sostituirò con un segno che da meno problemi tipo @
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Oggi e' domenica 10365 settembre 1993

Messaggio da Lucio C »

... e' anche meglio NON citare l'intero messaggio a cui si risponde (e tipicamente non citarlo affatto se e' quello immediatamente precedente nel thread)
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)
tigerwalk1
Prode Principiante
Messaggi: 12
Iscrizione: sabato 15 gennaio 2022, 12:37
Desktop: Cinnamon
Distribuzione: Linux Mint 20.3
Sesso: Maschile

Re: script bash sostituzione lettere/numeri

Messaggio da tigerwalk1 »

#!/bin/csh

foreach i (*)à
echo
set a = `echo $i | sed -e 's/a/1°/g' -e 's/b/2°/g' -e 's/c/3°/g' -e 's/d/4°/g' -e 's/e/5°/g' -e 's/f/6°/g' -e 's/g/7°/g' -e 's/h/8°/g' -e 's/i/9°/g' -e 's/j/10°/g' -e 's/k/11°/g' -e 's/l/12°/g' -e 's/m/13°/g' -e 's/n/14°/g' -e 's/o/15°/g' -e 's/p/16°/g' -e 's/q/17°/g' -e 's/r/18°/g' -e 's/s/19°/g' -e 's/t/20°/g' -e 's/u/21°/g' -e 's/v/22°/g' -e 's/x/23°/g' -e 's/y/24°/g' -e 's/w/25°/g' -e 's/z/26°/g'`
echo
mv $i $a
echo
end
come risposta ottengo:

Codice: Seleziona tutto

tigerwalk@tigerwalk-Lenovo-ideapad-110-15ISK:~/pwd$ ./testo1.sh 
foreach: Words not parenthesized.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: script bash sostituzione lettere/numeri

Messaggio da vaeVictis »

Prova

Codice: Seleziona tutto

#!/bin/bash
for file in *\ *; do
    newName=$( echo "$file" | sed -e 's/a/1°/g' -e 's/b/2°/g' -e 's/c/3°/g' -e 's/d/4°/g' -e 's/e/5°/g' -e 's/f/6°/g' -e 's/g/7°/g' -e 's/h/8°/g' -e 's/i/9°/g' -e 's/j/10°/g' -e 's/k/11°/g' -e 's/l/12°/g' -e 's/m/13°/g' -e 's/n/14°/g' -e 's/o/15°/g' -e 's/p/16°/g' -e 's/q/17°/g' -e 's/r/18°/g' -e 's/s/19°/g' -e 's/t/20°/g' -e 's/u/21°/g' -e 's/v/22°/g' -e 's/x/23°/g' -e 's/y/24°/g' -e 's/w/25°/g'  -e 's/z/26°/g' )
    mv "$file" "$newName"
done
Ma il ciclo for è brutto davvero per una cosa del genere.
Inoltre, i nomi dei file contengono spazi?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
tigerwalk1
Prode Principiante
Messaggi: 12
Iscrizione: sabato 15 gennaio 2022, 12:37
Desktop: Cinnamon
Distribuzione: Linux Mint 20.3
Sesso: Maschile

Re: script bash sostituzione lettere/numeri

Messaggio da tigerwalk1 »

vaeVictis ha scritto:
domenica 16 gennaio 2022, 17:32
Prova
.............
Ma il ciclo for è brutto davvero per una cosa del genere.
Inoltre, i nomi dei file contengono spazi?
Funziona! Molte grazie. No, i nomi non contengono spazi
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: script bash sostituzione lettere/numeri

Messaggio da Lucio C »

@tigerwalk1: nello script csh c'e' una a accentata che causa l'errore

inoltre per "mettere l'echo per debug" non intendevo mettere due comandi di echo prima di mv (che causerebbero solo ... due righe bianche per ogni file senza fare vedere nulla) ma scrivere echo mv $i $a cosi' fa vedere il comando senza eseguirlo ... poi si rimuove "echo"
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
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Oggi e' domenica 10365 settembre 1993

Messaggio da vaeVictis »

Lucio C ha scritto:
domenica 16 gennaio 2022, 17:11
... e' anche meglio NON citare l'intero messaggio a cui si risponde (e tipicamente non citarlo affatto se e' quello immediatamente precedente nel thread)
Mi era quasi sfuggito il titolo di questo messaggio.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
tigerwalk1
Prode Principiante
Messaggi: 12
Iscrizione: sabato 15 gennaio 2022, 12:37
Desktop: Cinnamon
Distribuzione: Linux Mint 20.3
Sesso: Maschile

Re: script bash sostituzione lettere/numeri

Messaggio da tigerwalk1 »

@Lucio C
Anche togliendo la a accentata, non funziona. Ottengo sempre:

Codice: Seleziona tutto

foreach: Words not parenthesized.
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: script bash sostituzione lettere/numeri

Messaggio da Lucio C »

Ci deve essere qualche carattere nascosto, se io faccio cut and paste ed eseguo da me gira. Pensavo mancassero degli spazi tra i e (*) nella invocazione di foreach ... ma direi di no. Oppure c'e' qualcosa nei nomi dei files che causa la espansione dell'asterisco a considerare delle parentesi spurie ? C'e' differenza tra quesi due casi ? Oppure in quel directory ci sono cosi' tanti file che la espansione dell'asterisco viene troncata ?

Codice: Seleziona tutto

foreach i (*)
echo $i
end

Codice: Seleziona tutto

foreach i (`ls`)
echo $i
end
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)
tigerwalk1
Prode Principiante
Messaggi: 12
Iscrizione: sabato 15 gennaio 2022, 12:37
Desktop: Cinnamon
Distribuzione: Linux Mint 20.3
Sesso: Maschile

Re: script bash sostituzione lettere/numeri

Messaggio da tigerwalk1 »

Codice: Seleziona tutto

foreach i (*)
echo $i
end
Così, funziona
Avatar utente
tokijin
Moderatore Globale
Moderatore Globale
Messaggi: 4606
Iscrizione: mercoledì 3 giugno 2009, 23:10
Desktop: plasma 5.27.4
Distribuzione: Kubuntu 23.04
Località: Abruzzo

Re: [Risolto]script bash sostituzione lettere/numeri

Messaggio da tokijin »

Il problema pare risolto, bene così :)

Ricordo a tutti che in sezione tecnica è bene non divagare: si analizza il problema esposto nel primo messaggio e si cerca di fornire una soluzione, chiedendo eventualmente informazioni aggiuntive o altro, ma senza uscire troppo dal seminato.

Ciao :ciao:
Sei abbruzzese se dopo che ti sei strafogato un chilogrammo di pasta, hai il coraggio di dire alla cuoca "cacc ch'è cott" - Se entra un piccione in casa..chiudi le finestre!
Ubuntu User #28657 - Il mio vecchio hardware - Tag Codice
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 16 ospiti