2013-06-18 21 views
5

Bardzo proste pytanie, ale nie wydaje się znaleźć prostą odpowiedź ...filtracyjne znaków spoza alfabetu spośród ciąg w skrypcie powłoki

Piszę skrypt bash, który wymaga, aby usunąć wszystkie niealfabetyczne i zakaz -numeryczne znaki. Na przykład. Chcę ...

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

OUTPUT_STRING= # some form of processing on $INPUT_STRING # 

echo $OUTPUT_STRING 
ABC123 

Zdaję sobie sprawę, że to byłoby najlepiej rozwiązać za pomocą wyrażenia regularnego, ale nie wiem, jak to wykorzystać efektywnie w skrypcie.

Każda pomoc mile widziana ...

Odpowiedz

8

Można użyć sed rozebrać wszystkie znaki, które nie są a-z, A-Z lub 0-9:

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

Więc w twoim przypadku,

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

Dokładnie tego potrzebuję, dzięki! – Rich

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

A raczej "OUTPUT_STRING =" $ {INPUT_STRING // [! [: Alnum:]]} "' – l0b0

+1

Dzięki, nie zauważyłem, że @Rich chciał zapisać zmodyfikowaną wartość w zmiennej. Chciałbym użyć 'OUTPUT_STRING = $ {INPUT_STRING // [! [: Alnum:]]}', jednak prawa strona instrukcji przypisania nie podlega podziałowi słowo/pole, więc cytaty są zbędne. –

+1

Zasmuca moje serce, widząc kolejne, czyste rozwiązanie BASH, które przegrywa z leniwym rozwidleniem sed/awk/perl P.O.S. – Orwellophile

Powiązane problemy