使用 sed 操作文件

使用 sed 操作文件

我有一个名为的文件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 可能更容易,并且只打印前两个字段。

相关内容