2013-06-18 2 views
5

domanda molto semplice, ma non riesco a trovare una risposta semplice ...filtro caratteri non alfabetici su stringa in script di shell

Sto scrivendo uno script bash che ha bisogno di rimuovere tutti i non-alfabetico e non -numeri caratteri. Per esempio. Voglio ...

INPUT_STRING="ABC# .1-2-3" 

OUTPUT_STRING= # some form of processing on $INPUT_STRING # 

echo $OUTPUT_STRING 
ABC123 

mi rendo conto che questo sarebbe meglio risolto utilizzando espressioni regolari, ma non è sicuro come utilizzare in modo efficace nello script.

Tutto l'aiuto molto apprezzato ...

risposta

8

È possibile utilizzare sed mettere a nudo tutti i caratteri che non sono a-z, A-Z o 0-9:

$ echo "ABC# .1-2-3" | sed 's/[^a-zA-Z0-9]//g' 
ABC123 

Quindi nel tuo caso,

$ INPUT_STRING="ABC# .1-2-3" 
$ OUTPUT_STRING=$(echo $INPUT_STRING | sed 's/[^a-zA-Z0-9]//g') 
$ echo $OUTPUT_STRING 
ABC123 
+1

Questo è esattamente ciò di cui ho bisogno, grazie! – Rich

8
$ INPUT_STRING="ABC# .1-2-3" 
$ printf '%s\n' "${INPUT_STRING//[![:alnum:]]}" 
ABC123 
+1

O meglio, 'OUTPUT_STRING =" $ {INPUT_STRING // [! [: Alnum:]]} "' – l0b0

+1

Grazie, non ho notato che @Rich voleva memorizzare il valore modificato in una variabile. Vorrei usare 'OUTPUT_STRING = $ {INPUT_STRING // [! [: Alnum:]]}' tuttavia, il lato destro dell'istruzione di assegnazione non è soggetto alla divisione della parola/campo della shell, quindi le virgolette sono ridondanti. –

+1

Mi rattrista il cuore nel vedere un'altra soluzione pura di BASH perdere per un bifolco pigro sed/awk/perl P.O.S. – Orwellophile