删除包含非字母字符的单词

删除包含非字母字符的单词

给定一个包含空格分隔的字符串和制表符分隔的整数的文本文件,我想删除所有包含非字母字符的单词,但保留仅由字母字符和制表符加上后面的整数组成的单词。

我的尝试(例如以下尝试)没有取得任何成果。我想表达的是:“替换单词边界内以 0 个或多个任意内容开头和结尾的任何内容,并且中间至少有一个 :digits: 或 :punct:”。

sed 's/\b.*[:digits::punct:]+.*\b//g'
sed 's/\b.*[^:alpha:]+.*\b//g'

我遗漏了什么?请参阅下面的示例输入数据。

谢谢你!

输入:

asdf 754m   563  
a2a 754mm   291  
754n    463  
754 ppp 1409  
754pin  4652  
pin pin 462  
754pins 652  
754 ppp </D>    1409  
<D> 754pin  4652  
pi$n pin    462  
754/p ins   652  
754 pp+p    1409  
754 p=in    4652  

期望输出:

asdf    563  
    291  
    463  
ppp 1409  
    4652  
pin pin 462  
    652  
 ppp    1409  
    4652  
 pin    462  
 ins    652  
    1409  
    4652  

答案1

基本上,这是一长串需要删除的内容:

sed -r 's/(^[[:digit:]]+\b|\b[[:digit:]]+[[:punct:]]*[[:alpha:]]+\b|\b[[:alpha:]]+[[:digit:]]+[[:alpha:]]+\b|\b[[:alpha:]]+[[:punct:]]+[[:alpha:]]+\b|[[:punct:]]+.*[[:punct:]]+)//g' file

删除这些:

  • 行首的数字
  • 以数字开头、可能包含标点符号并以字母结尾的单词
  • 由字母、数字、字母组成的单词
  • 由 alpha, punct, alpha 组成的单词
  • 以标点符号开头和结尾的序列

答案2

使用正则表达式难道不是最好地解决此问题吗?

([AZ]+制表符[0-9]+或类似的东西

答案3

因此,如果我理解正确的话,您希望保留包含所有单词或所有数字的单词。但没有其他内容,如果是这样的话,应该可以这样做:

(^|\s+)([A-Za-z]+|\d+)((?=\s)|(?=$))

(与多行标志一起使用)

当运行示例输入时,它会找到所有全是数字或全是单词的输入。与查找不匹配的每个单词相比,这是一种更简单的解决方案,但是您可以使用它来提取数据,而不是替换无效数据。

相关内容