2010-09-24 46 views
7

比方說「文本文件」包含以下內容:擊:文本文件分割成詞與非字母數字字符作爲分隔符

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

而且要打印在單獨一行上的每個字。 但是,單詞應該不僅由空格定義,而且由所有非字母數字字符定義。所以結果應該是這樣的:

lorem 
ipsum 
is9simply 
the 
dummy 
text 
of 
printing 

我怎樣才能做到這一點使用Bash shell?



一些注意事項:

  • 這不是一門功課的問題。

  • 簡單的情況下,單詞應該只由空格確定,很容易。只是寫

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

    會做的伎倆,並返回:

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

    對於由非字母數字字符分割的話我已經看到了使用IFS環境變量(下面的鏈接解決方案),但我想避免使用IFS有兩個原因:1)它需要(我認爲)將IFS設置爲一個非字母數字字符的長列表。 2)我覺得它很醜陋。

  • 這裏有兩個相關的Q &當我發現
    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?

回答

17

使用tr命令:

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

的 '-c' 是補充指定的字符; '-s'擠出替代品的重複; 'a-zA-Z0-9'是一組字母數字字符(也許還加上_?); '\ n'是替換字符(換行符)。你也可以使用一個字符類,這是語言環境敏感的(可能包括比列表多個字符以上):

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

完美,這正是我之後。謝謝! (對不起,我沒有足夠的聲望來投票回答你的答案) – Sv1 2010-09-24 23:03:52

+1

@ Sv1:你可能很快就會獲得很高的聲望。我把你的問題投給了你,因爲你記錄了你想要的內容以及你所做的所有研究。 – grok12 2011-06-26 18:00:29

+0

如果你有十進制數? – Leyu 2012-03-20 06:49:17

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

謝謝羅斯!這非常酷,我一直有意進入awk宇宙:) – Sv1 2010-09-28 05:40:22