2014-05-22 11 views
14

Sto scrivendo uno script bash che deve analizzare i nomi dei file.Rimuovi tutti i caratteri speciali e il caso dalla stringa in bash

Sarà necessario rimuovere tutti i caratteri speciali (compreso lo spazio):!?.-_ " e cambiare tutte le lettere maiuscole a minuscole Qualcosa di simile a questo:.

Some_randoM data1-A 
More Data0 

a:

somerandomdata1a 
moredata0 

Ho visto molte domande per farlo in molti linguaggi di programmazione diversi, ma non in bash. C'è un buon modo per farlo?

+0

minuscolo esempio lei e: http://stackoverflow.com/questions/2264428/converting-string-to-lower-case-in-bash-shell-scripting –

+0

Rimuovi gli spazi qui: http://stackoverflow.com/questions/369758/how- to-trim-whitespace-from-bash-variable –

+0

Più in generale, espressioni regolari di Bash: http://www.tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF –

risposta

26
cat yourfile.txt | tr -dc '[:alnum:]\n\r' | tr '[:upper:]' '[:lower:]' 

Il primo tr elimina i caratteri speciali. d significa eliminare, c significa complemento (invertire il set di caratteri). Quindi, -dc significa eliminare tutti i caratteri eccetto quelli specificati. I modelli \n e \r sono inclusi per conservare le nuove linee di stile linux o windows, che presumo tu voglia.

Il secondo converte caratteri maiuscoli in minuscolo.

+6

Solo se tu (proprio come me) è venuto qui alla ricerca di una soluzione per sbarazzarsi di caratteri come \ r \ n o^C in una variabile var2 = 'echo $ var | tr -d '[: cntrl:]' 'è la soluzione. Grazie a questa risposta l'ho capito. – Arsen

10

soluzione bash pura:

$ filename='Some_randoM data1-A' 
$ f=${filename//[^[:alnum:]]/} 
$ echo "$f" 
SomerandoMdata1A 
$ echo "${f,,}" 
somerandomdata1a 

Una funzione per questo:

clean() { 
    local a=${1//[^[:alnum:]]/} 
    echo "${a,,}" 
} 

Prova ora:

$ clean "More Data0" 
moredata0 
+1

+1; l'operatore ',,' (converte l'intera stringa in minuscolo) richiede 'bash 4 +'. – mklement0

3

se si utilizza mkelement0 e l'approccio Dan Bliss. Puoi anche esaminare l'espressione regolare sed + POSIX.

cat yourfile.txt | sed 's/[^a-zA-Z0-9]//g' 

Sed corrisponde a tutti gli altri personaggi che non sono contenuti all'interno delle parentesi, tranne lettere e numeri e rimuoverli.

2

ho usato tr per rimuovere eventuali caratteri che non fanno parte della classe [:print:]

cat file.txt | tr -dc '[:print:]' 

o

echo "..." | tr -dc '[:print:]' 

Inoltre si potrebbe desiderare di | (pipe) l'output a od -c per confermare il risultato

cat file.txt | tr -dc '[:print:]' | od -c 
Problemi correlati