![我很难使用正则表达式从数据文件中提取某些信息](https://linux22.com/image/849000/%E6%88%91%E5%BE%88%E9%9A%BE%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%BB%8E%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%E4%B8%AD%E6%8F%90%E5%8F%96%E6%9F%90%E4%BA%9B%E4%BF%A1%E6%81%AF.png)
我正在处理的数据具有以下格式:
1880 20 David 7570 Mabel 13096
我只需要提取年份 (1880)、排名 (20) 和姓名 (David 或 Mabel)。最终结果是:
1880 20 David
或者
1880 20 Mabel
我已经成功地分别提取了年份、排名和姓名,但我无法将整个正则表达式组合在一起。我知道正则表达式的基础知识,但目前无法访问我的笔记。
我正在尝试使用 egrep。
答案1
grep -Po '\d+\s+\d+\s+\w+' file.txt
答案2
我推荐一个 Python 解决方案(我不知道您当前正在使用什么):
import re
re_find_data = re.compile(r'^(\d+)\s+(\d+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+)$')
for line in open(r'/path/to/file'):
for match in re_find_date.findall(line):
print(match)
# Do something with 'match'
# You can index the 'match' tuple like so:
print(match[2])
# Print 3rd part (name)
关于grep
我不确定 grep 是否可以用于这种情况。它缺乏打印特定编号组的能力,而这正是您所需要的(我相信)。我很想知道您的教授(或其他人)是否有纯 grep 的解决方案。
这个正则表达式应该可以工作,但是您需要从编号组中提取所需的字段(在 Python 示例中演示):
(\d+)\s+(\d+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+)
grep 并不是合适的工具。Regex 才是,但是采用不同的实现(你好,Python!)。
答案3
仅使用 grep 是不可能做到这一点的(至少从我上课的情况来看)。几天后,我的教授告诉我,他希望我们使用命令组合来实现所需的结果。但是,当我尝试这些答案时,它们都是有效的。这只是基于非常初级的知识(与我目前的 Ubuntu 经验相当)对这个问题的直接回答。