Come spogliare un nome di file di caratteri speciali?

6

Ho un file con un nome come "Today's Date.txt"

Quello che mi interessa è rimuovere tutti i caratteri speciali usando il terminale come:

" - , ' ' [ 

La ragione di ciò è dovuta al fatto che li inserisco in uno script in un secondo momento ed è troppo mal di testa che tiene conto e modifica i nomi individualmente.

Spaces "" e Underscores "_" e l'alfabeto "A-Z, a-z" sono ok e sostituiscono i caratteri piuttosto che cancellarli.

All'inizio pensavo che il comando terminale "iconv" potesse aiutarmi convertendo in una codifica più semplice, ma ho provato molte delle codifiche e sembra che potrei sbagliarmi.

So che le espressioni regolari potrebbero aiutarmi, ma purtroppo non sono esperto in loro. Ho trovato questa domanda che sembra realizzata, ma non so come implementarla o se copre gli stessi casi dei miei.

Il motivo per cui ho postato questo è perché questa domanda potrebbe essere unica per il set di caratteri Supporti OSX per i nomi di file e la codifica che usa ... anche se è più probabile che non abbia idea di cosa sto parlando.

Grazie per il tuo aiuto in anticipo.

Modifica: il comando

sed 's/[!@#\$%^&*()]//g'

Sembra funzionare molto bene ma non riesco a farlo funzionare per il mio caso di utilizzo originale e altri:

' ' "

Non riescono nemmeno a sfuggirle. Sono molto nuovo nello script di bash quindi ti prego di sopportare me.

Modifica 2: postando questo qui altrimenti dovrei aspettare 6 ore.

Oltre alla risposta di Alan Shutko, vorrei aggiungere la mia soluzione che ho trovato.

awk '{gsub(/[[:punct:]]/,"")}1'

Sono un po 'titubante a postare questo dato che non riesco a spiegarlo bene.

Awk, come dice la pagina man, è usato per "linguaggio di scansione ed elaborazione basato su pattern". La funzione gsub cerca e sostituisce tutte le occorrenze dell'espressione regolare immessa. La parte di gsub sarebbe simile a questa:

gsub("a","b")

Dove nel mio esempio, tutte le occorrenze di a sarebbero sostituite da b. Come nel commento sopra [[: punct:]] suona come se fosse l'acronimo di tutti i segni di punteggiatura. Tuttavia, non so cosa significhi l'1 all'esterno delle parentesi.

    
posta fredie mathews 07.06.2013 - 03:09
fonte

3 risposte

10

Se hai un set specifico di caratteri che vuoi mantenere, tr funziona molto bene.

Ad esempio

tr -cd 'A-Za-z0-9_-'

Rimuoverà qualsiasi carattere non nel set di caratteri elencati. (Il -d significa delete, e -c significa il complemento dei caratteri elencati: in altre parole, qualsiasi carattere non elencato viene eliminato.)

    
risposta data 07.06.2013 - 04:00
fonte
5

Questo sostituirà solo le virgolette singole con caratteri di sottolineatura:

for f in *; do mv "$f" "${f//'/_}"; done

Questo manterrà solo caratteri alfanumerici ASCII, caratteri di sottolineatura e punti:

for f in *; do mv "$f" "$(sed 's/[^0-9A-Za-z_.]/_/g' <<< "$f")"; done

Locali come en_US.UTF-8 utilizzano l'ordine di confronto ASCII su OS X, ma [[:alnum:]] e \w corrispondono anche a caratteri come ä in essi. Se LC_CTYPE è C , i caratteri multi-byte sono sostituiti con più caratteri di sottolineatura.

    
risposta data 07.06.2013 - 16:39
fonte
2

Recentemente ho avuto lo stesso problema e ho dovuto rimuovere i nomi di file di tutti i file in una cartella di caratteri speciali. Ho usato questo comando, che è una combinazione di entrambe le risposte pubblicate qui, ma mantiene anche i periodi. Forse aiuta qualcuno.

for file in *; do echo mv "$file" 'echo $file | tr -cd 'A-Za-z0-9_.-'' ; done

rimuovere echo davanti a mv "$file" esegue il comando.

    
risposta data 15.11.2016 - 18:09
fonte

Leggi altre domande sui tag