我有一个文件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
Sellen, Jo: 03.07.1987: MSc CSE
如何将下面的命令更改为sed
返回 1987 年出生的学生的所有姓氏的命令?
$ grep 1987 students.txt | grep -o "^\(.*\),"
答案1
sed -n '/1987/s/^\([^,]*\),.*$/\1/p' students.txt
或者正如格伦指出的:
sed -n '/1987/s/,.*//p' students.txt
答案2
如果你想使用 awk 我会建议对 Johnsyweb 的不同答案。 awk 的强大功能包括选择字段分隔符:
awk -F'[,: ]*' '$3 ~ /1987$/ {print $1}' students.txt
但问题是关于 sed 的,所以我相信 SiegeX 应该获得更好的投票。
答案3
此类问题非常适合awk
:
% awk '/\.1987:/ {gsub(/,.*/, ""); print}' students.txt
Taylor
Sellen
或者,指定一列,而不是整行(如果您希望在以下位置添加其他列,则可以更轻松地进行自定义:
% awk '/\.1987:/ {
gsub(/,$/, "", $1);
print $1;
}' students.txt
Taylor
Sellen