我有一个名为的文件students.txt
,它包含以下格式的数据Surname, Forename: day.month.year: Degree
:
Smith, John: 15.01.1986: MSc IT
Taylor, Susan: 04.05.1987: MSc IT
Thomas, Steve: 19.04.1986: MSc MIT
Sennick, Joseph: 01.12.1987: MSc IT
我试图返回格式中的所有行Forename,Surname: day.month.year
,但没有MSc
正在研究的学位。到目前为止我有:
sed -e 's/\(.*\),(.*\)/\2/\1/' students.txt
这有什么问题吗?
答案1
虽然以下解决方案是非通用的,但如果数据格式保持相同,则以下解决方案也将起作用;
sed -r 's/^([A-Za-z]+), ([A-Za-z]+): (([0-9]{2}\.){2}[0-9]{4}): .*$/\2,\1: \3/' students.txt
答案2
这应该可以做到:
sed -e 's/\([^,:]*\), *\([^:]*\)/\2, \1/;s/:[^:]*$//' student.txt
第一条语句(用 分隔;
)搜索由逗号空格分隔的姓氏和由冒号分隔的名字,并使用逗号空格分隔符交换它们。第二条语句搜索最后一个冒号并将其以及行尾的所有内容删除。正如有人提到的,这可以由 awk 处理。
awk -F: 'BEGIN{OFS=":"}{split($1,N,", ");$1=N[2]", "N[1];NF=2;print}' student.txt
量子电动力学
答案3
因为sed
你需要三个反向参考。第一个由逗号分隔,后两个由冒号分隔
sed 's/^\([^,]*\), \([^:]*\): \([^:]*\).*$/\2, \1: \3/' students.txt
然而,在处理分隔符和字段时,它awk
确实是一个可以使用的工具,因为您可以指定一个字段分隔符,它可以是正则表达式。在本例中,我们的字段分隔符是逗号或冒号,后跟空格。
awk -F'[,:] ' '{printf("%s, %s: %s\n",$2,$1,$3)}' students.txt
答案4
与 sed 相比,使用带有“:”字段分隔符的 awk 可能更容易,并且只打印前两个字段。