Vai al contenuto

Aiuto espressioni regolari in *nix


jeby

Messaggi Raccomandati:

Fantastico grazie!!!! Anche cono lo spazio in fondo va benissimo!

In pratica con BASH_REMATCH[1] vai a prendere solo la parte tra parentesi, giusto?

Appena riesco a far ripartire il cell provo che dal computer dell'ufficio non riesco a collegarmi con ssh a casa :)

Mi è venuto il dubbio ed ho corretto il baco con awk.

Ho corretto anche un altro bug che avevo lasciato in giro: il secondo mv dava errore e non spostava file rinominati in un run precedente e che non avevano quindi matchato il primo if. :D

Modifico direttamente il codice che ti ho postato nei messaggi precedenti, senza copiarlo ulteriormente, così quello che hai quotato tu rimane vecchio e puoi vedere le varie versioni se vuoi vedere la differenza :)

Ok, ora smetto, giuro.

PS: una cosa di questo tipo sarebbe venuta elegantissima fatta in groovy. Ma pazienza :D

Modificato da Artemis

"Fico, io ti rispondo che al buio tutti i gatti sembrano leopardi e che non bisogna mai comprare un gatto in un sacco. C'entrano qualcosa? Probabilmente no, esattamente come la tua metafora." [Loric]

Link al commento
Condividi su altri Social

  • Risposte 37
  • Creato
  • Ultima Risposta

I più attivi nella discussione

Giorni di maggior attività

I più attivi nella discussione

Jeby, posso dire?... :D

Rename

Vi stimo comunque a manetta per l'uso di Bash. ;):idol:

Temo che non faccia tutto quello che serve, perchè fa solo sostituzioni per pattern e quindi richiederebbe più passate.

E, tra l'altro, è per mac.

"Fico, io ti rispondo che al buio tutti i gatti sembrano leopardi e che non bisogna mai comprare un gatto in un sacco. C'entrano qualcosa? Probabilmente no, esattamente come la tua metafora." [Loric]

Link al commento
Condividi su altri Social

Temo che non faccia tutto quello che serve, perchè fa solo sostituzioni per pattern e quindi richiederebbe più passate.

E, tra l'altro, è per mac.

Ma Jeby ha un Mac! :D e chiedeva

Quello che vorrei fare è sostituire tutti i "_" con " " e tutti i "%28" e "%29" con "(" e ")"

e questo si può fare. L'ho fatto migliaio di volte.

BMW M135i xDrive 306 cv

Link al commento
Condividi su altri Social

Ma Jeby ha un Mac! :D e chiedeva

e questo si può fare. L'ho fatto migliaio di volte.

Può applicare più pattern a cascata sullo stesso nome file senza cercarlo più volte? Dallo screenshot non sembra.

"Fico, io ti rispondo che al buio tutti i gatti sembrano leopardi e che non bisogna mai comprare un gatto in un sacco. C'entrano qualcosa? Probabilmente no, esattamente come la tua metafora." [Loric]

Link al commento
Condividi su altri Social

ho un Mac ma tutto ciò lo farà il raspberry pi quindi niente GUI e niente Mac! Grazie Artemis, stasera provo e ti faccio sapere!

e poi a volte voglio eseguire da remoto e mi viene più comodo usare i bash, o anche per operazioni ricorrenti

Per eliminare tutto quello che viene dopo lo spazio e il numero si potrebbe usare anche la sostituzione dei paramteri nella variabile, tipo molto grezzamente:


for nomefile in cartella
do
sottocartella = ${filename%%un-espressione-che-non-so}
mv nomefile sottocartella/nomefile
done

mi è venuto in mente che usavo una roba del genere per prendere il nome del file senza l'estensione e che probabilmente si potrebbe fare lo stesso in questo caso. Ma la mia 'gnorazna è crassa, quindi mi affido al tuo script :)

PS: sto guardando awk... sembra IL comando definitivo!

Mazda MX-5 20th anniversary "barbone edition" - Tutto quello che scrivo è IMHO

k21x8z.png

Link al commento
Condividi su altri Social

ho un Mac ma tutto ciò lo farà il raspberry pi quindi niente GUI e niente Mac! Grazie Artemis, stasera provo e ti faccio sapere!

e poi a volte voglio eseguire da remoto e mi viene più comodo usare i bash, o anche per operazioni ricorrenti

Per eliminare tutto quello che viene dopo lo spazio e il numero si potrebbe usare anche la sostituzione dei paramteri nella variabile, tipo molto grezzamente:


for nomefile in cartella
do
sottocartella = ${filename%%un-espressione-che-non-so}
mv nomefile sottocartella/nomefile
done

mi è venuto in mente che usavo una roba del genere per prendere il file senza l'estensione e che probabilmente si potrebbe fare lo stesso in questo caso. Ma la mia 'gnorazna è crassa, quindi mi affido al tuo script :)

PS: sto guardando awk... sembra IL comando definitivo!

In realtà la Bash supporta diversi modi per creare substring, sia nativamente sia con l'uso di software tipo cut o grep.

Ma il problema essenziale è che questi approcci richiedono necessariamente che il delimitatore sia un carattere o al limite una sequenza di caratteri precisi e ripetibili.

Nel caso delle specifiche che avevi dato tu, poteva essere un numero qualsiasi di tre cifre, e quindi tutto ciò che si sa di lui è che è [0-9]{3}. Da qui la necessità di creare un matcher.

awk è estremo. C'è il comando (di cui hai letto qualche uso nel mio script) ma è anche e soprattutto una apposito linguaggio di script orientato alla manipolazione di stream di dati.

è estremamente completo ed estramente complesso. Io stesso lo conosco solo superficialmente.

"Fico, io ti rispondo che al buio tutti i gatti sembrano leopardi e che non bisogna mai comprare un gatto in un sacco. C'entrano qualcosa? Probabilmente no, esattamente come la tua metafora." [Loric]

Link al commento
Condividi su altri Social

Leggo velocemente, magari dopo ci faccio una pensata.

Ictu oculi suggerirei find con le regexp al posto di ls :)

edit: qualcosa tipo (untested):


find "${MYPATH}" -maxdepth 1 -mindepth 1 -type f -iregex ".*[0-9][0-9][0-9]_.*" -print0 | while IFS= read -r -d $'\0' kk; do
(paciughi col nome che si trova in ${kk})
done

Modificato da loric

Alfiat Bravetta senza pomello con 170 cavalli asmatici che vanno a broda; pack "Terrone Protervo" (by Cosimo) contro lo sguardo da triglia. Questa è la "culona".

Link al commento
Condividi su altri Social

Qualcuno aveva rotto il forum? E' stato irraggiungibile per un bel po'.

Ecco la mia versione dello script, ho fatto tutta la manipolazione delle stringhe con bash, niente sed o awk.


#!/bin/bash




MYPATH="$HOME/prova/"
DESTDIR="$HOME/prova/mydir/"


#Qui "print0" protegge contro nomi di file costruiti in maniera furbetta. Manipolare l'output di ls è un security risk
find "${MYPATH}" -maxdepth 1 -mindepth 1 -type f -regex ".*[0-9][0-9][0-9]_.*" -print0 | while IFS= read -r -d $'\0' kk; do
NODIRNAME="${kk##*/}" # Elimina la componente path dal nome del file


DESTNAME="${NODIRNAME//_/ }" # Sostituisce '_' con ' '
DESTNAME="${DESTNAME//\%28/(}" #Sostituisce "%28" con '('
DESTNAME="${DESTNAME//\%29/)}" #Sostituisce "%29" con ')'


#Estrae la parte del nome prima del pattern "[0-9][0-9][0-9]_.*". Sarà la nostra nuova sottocartella
SUBDIR="${NODIRNAME/ [0-9][0-9][0-9]_*}"


#Se la directory non esiste la creiamo
mkdir -p "${DESTDIR}/${SUBDIR}"


# Qui "-n" impedisce l'overwrite del file destinazione se esiste già un file col medesimo nome
mv -n "$kk" "${DESTDIR}/${SUBDIR}/${DESTNAME}"


done

Modificato da loric

Alfiat Bravetta senza pomello con 170 cavalli asmatici che vanno a broda; pack "Terrone Protervo" (by Cosimo) contro lo sguardo da triglia. Questa è la "culona".

Link al commento
Condividi su altri Social

Crea un account o accedi per lasciare un commento

Devi essere iscritto per commentare e visualizzare le sezioni protette!

Crea un account

Iscriviti nella nostra community. È facile!

Registra un nuovo account

Accedi

Sei già registrato? Accedi qui.

Accedi Ora

×
×
  • Crea Nuovo...

 

Stiamo sperimentando dei banner pubblicitari a minima invasività: fai una prova e poi facci sapere come va!

Per accedere al forum, disabilita l'AdBlock per questo sito e poi clicca su accetta: ci sarai di grande aiuto! Grazie!

Se non sai come si fa, puoi pensarci più avanti, cliccando su "ci penso" per continuare temporaneamente a navigare. Periodicamente ricomparità questo avviso come promemoria.