使用 tr 重新格式化 txt 文件,使每行包含 1 个单词

使用 tr 重新格式化 txt 文件,使每行包含 1 个单词

我想修改一个文件以删除所有标点符号、数字和大写字母,并更改文件以使每行只有 1 个单词例如:
Hello, how are you!

你 好吗


在一些帮助下我想出了这个:

tr -d '[:punct:]' < file | tr -s '[:space:]' '\n' | tr -d '[0-9]' | tr '[A-Z]' '[a-z]' > cleanfile.txt

然而问题是,当我的文件中有一个地址时,我最终会得到 httpadresscom 而不是

http  
adress  
com 

我也不希望像“don't”或“readme.txt”这样的词有这个输出

don  
t  
readme  
txt

答案1

这应该隔离所有单词,只留下点和引号在里面。和下划线,可能不想要 - 然后\w不起作用。

]# grep -oE "(\w|\.\w|'\w)*" text
one
two
Three
four
linux
file
system
isn't
What
nothing
mailto
a.b
some.org
Molly's
cat
Wrote
a
readme.txt

一二。三四linux的文件系统不是啥? “没什么”邮寄至: [电子邮件受保护]莫莉的猫。写了readme.txt。

问题tr是你需要的最小上下文。在这里你会被困住,因为some.org你想要分裂,但readme.txt不是。现在“@”不见了。

答案2

对于第一部分:不要删除标点符号,而是将其转换为空格。

对于第二个(不要等):您可能需要一本单词词典,或者不删除's。

相关内容