【问题标题】:Bash: Split text-file into words with non-alphanumeric characters as delimitersBash:将文本文件拆分为以非字母数字字符作为分隔符的单词
【发布时间】:2011-04-17 00:50:00
【问题描述】:

假设“文本文件”包含以下内容:

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) 我觉得有点丑。

  • 这是我找到的两个相关问答
    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?

【问题讨论】:

    标签: parsing bash scripting


    【解决方案1】:

    使用tr 命令:

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

    '-c'是指定字符的补码; '-s' 挤出重复的替换; 'a-zA-Z0-9' 是一组字母数字字符(也许也添加_?); '\n' 是替换字符(换行符)。您还可以使用对语言环境敏感的字符类(并且可能包含比上面列表更多的字符):

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

    【讨论】:

    • 完美,这正是我所追求的。谢谢! (很抱歉,我没有足够的声誉来投票赞成您的答案)
    • @Sv1:你可能很快就会有很高的声誉。我对你的问题投了赞成票,因为你记录了你想要的东西以及你对它所做的所有研究。
    • 如果你有十进制数怎么办?
    • @Leyu:将多余的字符添加到保留的集合中:tr -cs '[:alnum:]+-.' '\n' &lt; textfile。当然,这将允许通过句号、省略号和虚线等。但它也将允许通过 +1.23 和 -1.24e-23 等。
    【解决方案2】:
    $ 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] }
    }
    

    【讨论】:

    • 感谢罗斯!这很酷,我一直想进入 awk-universe :)
    猜你喜欢
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多