给定一个包含空格分隔的字符串和制表符分隔的整数的文本文件,我想删除所有包含非字母字符的单词,但保留仅由字母字符和制表符加上后面的整数组成的单词。
我的尝试(例如以下尝试)没有取得任何成果。我想表达的是:“替换单词边界内以 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)|(?=$))
(与多行标志一起使用)
当运行示例输入时,它会找到所有全是数字或全是单词的输入。与查找不匹配的每个单词相比,这是一种更简单的解决方案,但是您可以使用它来提取数据,而不是替换无效数据。