2010-09-24 40 views
7

phép nói rằng "textfile" chứa những điều sau đây:Bash: Tách textfile thành các từ với các ký tự chữ và số không như delimiters

lorem$ipsum-is9simply the.dummy text%of-printing 

và rằng bạn muốn in mỗi từ trên một dòng riêng biệt. Tuy nhiên, các từ phải được xác định không chỉ theo khoảng trắng, mà bởi tất cả các ký tự không phải chữ và số. Vì vậy, kết quả sẽ như sau:

lorem 
ipsum 
is9simply 
the 
dummy 
text 
of 
printing 

Làm cách nào để thực hiện điều này bằng vỏ Bash?



Một số lưu ý:

  • Đây không phải là một câu hỏi bài tập về nhà.

  • Trường hợp đơn giản hơn khi chỉ được xác định bằng khoảng trắng, thật dễ dàng. Chỉ cần viết:

    for i in `cat textfile`; do echo $i; done; 
    

    sẽ làm các trick, và trở về:

    lorem$ipsum-is9simply 
    the.dummy 
    text%of-printing 
    

    Đối với những từ tách bởi các ký tự không tự chữ và số tôi đã thấy các giải pháp sử dụng IFS biến môi trường (liên kết bên dưới), nhưng tôi muốn tránh sử dụng IFS vì hai lý do: 1) nó sẽ yêu cầu (tôi nghĩ) thiết lập IFS cho một danh sách dài các ký tự không phải chữ và số. 2) Tôi thấy nó xấu xí.

  • Dưới đây là hai liên quan Q & Như tôi đã tìm thấy
    How do I split a string on a delimiter in Bash?
    How to split a line into words separated by one or more spaces in bash?

Trả lời

17

Sử dụng tr lệnh:

tr -cs 'a-zA-Z0-9' '\n' <textfile 

Các '-c' là dành cho bổ sung của các ký tự được chỉ định; '-s' ép ra các bản sao thay thế; 'a-zA-Z0-9' là tập hợp các ký tự chữ và số (có thể thêm _ nữa?); '\ n' là ký tự thay thế (dòng mới). Bạn cũng có thể sử dụng một lớp nhân vật đó là miền địa phương nhạy cảm (và có thể bao gồm các nhân vật hơn trong danh sách ở trên):

tr -cs '[:alnum:]' '\n' <textfile 
+0

Perfect, đây là chính xác những gì tôi đã sau. Cảm ơn! (Tôi xin lỗi tôi không có đủ danh tiếng để bỏ phiếu cho câu trả lời của bạn) – Sv1

+1

@ Sv1: Có thể bạn sẽ sớm có danh tiếng cao. Tôi đã bình chọn câu hỏi của bạn vì bạn đã ghi lại những gì bạn muốn và cho tất cả các nghiên cứu bạn đã thực hiện trên đó. – grok12

+0

Nếu bạn có số thập phân thì sao? – Leyu

3
$ awk -f splitter.awk < textfile 

$ cat splitter.awk 
{ 
    count0 = split($0, asplit, "[^a-zA-Z0-9]") 
    for(i = 1; i <= count0; ++i) { print asplit[i] } 
} 
+0

cảm ơn Ross! điều này khá thú vị, tôi đã có ý nghĩa để đi vào vũ trụ awk :) – Sv1

Các vấn đề liên quan