2013-06-18 24 views
5

Câu hỏi rất đơn giản nhưng dường như không thể tìm thấy câu trả lời đơn giản ...Lọc ký tự không phải chữ cái ra khỏi chuỗi trong tập lệnh shell

Tôi viết một tập lệnh bash cần xóa tất cả không phải chữ cái và không -các ký tự số. Ví dụ. Tôi muốn ...

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

OUTPUT_STRING= # some form of processing on $INPUT_STRING # 

echo $OUTPUT_STRING 
ABC123 

Tôi nhận thấy điều này sẽ được giải quyết tốt nhất bằng cách sử dụng regex, nhưng không chắc chắn cách sử dụng hiệu quả trong tập lệnh.

Tất cả giúp đỡ đánh giá rất cao ...

Trả lời

8

Bạn có thể sử dụng sed dải tất cả các ký tự mà không phải là a-z, A-Z hoặc 0-9:

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

Vì vậy, trong trường hợp của bạn,

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

Đó chính xác là những gì tôi cần, cảm ơn! – Rich

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

Hoặc đúng hơn, 'OUTPUT_STRING =" $ {INPUT_STRING // [! [: Alnum:]]} "' – l0b0

+1

Cảm ơn, tôi chưa nhận thấy rằng @Rich muốn lưu trữ giá trị đã sửa đổi trong một biến. Mặc dù vậy, tôi sẽ sử dụng 'OUTPUT_STRING = $ {INPUT_STRING // [! [: Alnum:]]}', phần bên phải của câu lệnh gán không phụ thuộc vào việc tách từ/trường vỏ, vì vậy các dấu ngoặc kép là thừa. –

+1

Thật là buồn lòng khi nhìn thấy một giải pháp BASH thuần túy khác đã bị mất đi một cách lười biếng, trầm trồ/perk/perl P.O.S. – Orwellophile