2013-06-18 6 views
5

Sehr einfache Frage, aber kann nicht scheinen, eine einfache Antwort zu finden ...Filter nicht-alphabetische Zeichen aus String in Shell-Skript

ich ein Bash-Skript schreibe, die alle nicht-alphabetischen und nicht entfernen muss -numerische Zeichen. Z.B. Ich möchte ...

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

OUTPUT_STRING= # some form of processing on $INPUT_STRING # 

echo $OUTPUT_STRING 
ABC123 

Mir ist klar, dass dies am besten mit regex gelöst werden würde, aber nicht sicher, wie dies im Skript effektiv zu nutzen.

Alle sehr geschätzt Hilfe ...

Antwort

8

Sie sed können alle Zeichen abzustreifen, die nicht a-z, A-Z oder 0-9 sind:

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

So in Ihrem Fall

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

Das ist genau das, was ich brauche, danke! – Rich

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

Oder besser gesagt, 'OUTPUT_STRING =" $ {INPUT_STRING // [! [: Alnum:]]} "' – l0b0

+1

Danke, ich habe nicht bemerkt, dass @Rich den modifizierten Wert in einer Variablen speichern wollte. Ich würde 'OUTPUT_STRING = $ {INPUT_STRING // [! [: Alnum:]]}} verwenden, obwohl die rechte Seite der Zuweisungsanweisung nicht der Shell-Wort/Feld-Aufteilung unterliegt, so dass die Anführungszeichen redundant sind. –

+1

Es ist traurig mein Herz zu sehen, noch eine andere reine BASH-Lösung verlieren, um eine faule Gabel sed/awk/perl P.O.S. – Orwellophile