我正在处理的数据具有以下格式:
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 经验相当)对这个问题的直接回答。