如何在unix命令行中以文字分割文件?

我正在做一个更快的testing一个天真的布尔信息检索系统,我想使用awk,grep,egrep,sed或类似的东西和pipe道将文本文件拆分成单词并保存到其他文件每行一个字。 例如我的文件cotains:

Hola mundo, hablo español y no sé si escribí bien la pregunta, ojalá me puedan entender y ayudar Adiós. 

输出文件应该包含:

 Hola mundo hablo español ... 

谢谢!

使用tr:

 tr -s '[[:punct:][:space:]]' '\n' < file 

使用sed

 $ sed -e 's/[[:punct:]]*//g;s/[[:space:]]\+/\n/g' < inputfile 

基本上这将删除所有的标点符号,并用换行符替换任何空格。 这也假定你的sed的味道理解\n 。 有些则不行 – 在这种情况下,您可以使用文字换行符(即将其嵌入到引号中)。

grep -o仅打印匹配模式的匹配行的部分

 grep -o '[[:alpha:]]*' file 

最简单的工具是fmt:

 fmt -1 <your-file 

fmt被设计为断行以符合指定的宽度,如果你提供-1它会立即在这个单词之后中断。 请参阅man fmt文档。 灵感来自http://everythingsysadmin.com/2012/09/unorthodoxunix.html

 cat input.txt | tr -d ",." | tr " \t" "\n" | grep -e "^$" -v 

tr -d“,” 删除“,”和“。”

tr“\ t”“\ n”将空格和制表符切换到换行符

grep -e“^ $”-v删除空行(如果有两个或多个空格)

这个awk行可能也工作?

 awk 'BEGIN{FS="[[:punct:] ]*";OFS="\n"}{$1=$1}1' inputfile 

根据你目前的反应,我想你可能在寻找的是将字词作为由空格,逗号,句尾字符(即英文中的“。”,“!”或“?”)和其他通常不会与字母数字字符(如“<”和“;”,而不是' - # $ % )结合使用的字符。 现在,“。” 是一个句子结尾字符,但你说$27.00应该被认为是一个“单词”,所以. 需要根据具体情况加以区别对待。 我认为“ – ”或者其他一些字符也可能是相同的。

所以你需要一个解决方案,将这个转换:

 I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "foo@bar.com". 

进入这个:

 I have $27.00 We're 20% under-budget right This is #2 mail me at foo@bar.com 

那是对的吗?

尝试使用GNU awk,以便我们可以将RS设置为多个字符:

 $ cat file I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "foo@bar.com". $ gawk -v RS="[[:space:]?!]+" '{gsub(/^[^[:alnum:]$#]+|[^[:alnum:]%]+$/,"")} $0!=""' file I have $27.00 We're 20% under-budget right This is #2 mail me at foo@bar.com 

试着想出一些其他的测试用例,看看它是否总能达到你想要的效果。

首先是一个非常简单的选择,

 sed 's,\(\w*\),\1\n,g' file 

当心它不处理撇号和标点符号

使用perl

perl -ne 'print join("\n", split)' < file

使用Perl :

 perl -pe 's/(?:\p{Punct}|\s+)+/\n/g' file 

产量

 Hola mundo hablo español y no sé si escribí bien la pregunta ojal  me puedan entender y ayudar Adiós 

perl -ne'print join(“\ n”,split)'

对不起@jsageryd

这一行不能给出正确的答案,因为它会把最后一个字与下一个字加在一起。

这是更好的,但为src中的每个空白行生成一个空行。 通过|管道 sed'/ ^ $ / d'来解决这个问题

perl -ne'{print join(“\ n”,split(/ [[:^ word:]] + /)),“\ n”; }”