Bash:将文本文件拆分为包含非字母数字字符作为分隔符的单词

时间:2010-09-24 22:48:48

标签: parsing bash scripting

让我们说“ textfile ”包含以下内容:

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& As I found
    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?

2 个答案:

答案 0 :(得分:18)

使用tr命令:

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

'-c'用于指定字符的补充; '-s'挤出了替换品的副本; 'a-zA-Z0-9'是一组字母数字字符(也可以添加_?); '\ n'是替换字符(换行符)。您还可以使用区域设置敏感的字符类(并且可能包含比上面列表更多的字符):

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

答案 1 :(得分: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] }
}