使用sed过滤掉列表中的学生

时间:2016-10-11 02:15:59

标签: bash ubuntu vim sed

我有一个学生列表,我已将其保存到文本文件students.txt

John Doe Marketing Junior B
Betty Metty Engineering Junior A
James Names Nursing Sophomore B
Bob Nob History Freshman B
Hope Nope Engineering C

它可能非常简单,但由于我是shell脚本的初学者,所以sed模式命令会打印出人物,只有名字和姓氏,其中有一个A in他们的专业(字母@结尾)?

如果您可以链接一个有用的网站,以获取与列表相关的sed模式搜索规则,这些规则也很棒。

使用vim,Ubuntu 16.04

3 个答案:

答案 0 :(得分:3)

不是最合适的工具,更好地使用这样:

 awk '$5=="A"{print $1, $2}' file

输出

Betty Metty

编辑,过滤工程:

awk '$5=="A" && $3=="Engineering"{print $1, $2}' file

答案 1 :(得分:1)

$ cat ip.txt 
John Doe Marketing Junior B
Betty Metty Engineering Junior A
James Names Nursing Sophomore B
Bob Nob History Freshman B
Hope Nope Engineering C

$ sed -nE '/A$/ s/^(\S+\s+\S+).*/\1/p' ip.txt 
Betty Metty
  • -n默认情况下不打印行
  • -E使用扩展正则表达式
  • /A$/在行尾<{li>匹配A
  • s/^(\S+\s+\S+).*/\1/p捕获前两个以空格分隔的非空格字符序列,省略其余行并打印此修改后的行

使用GNU sed进行就地编辑:

sed -i -nE '/A$/ s/^(\S+\s+\S+).*/\1/p' ip.txt 


使用vim

:v/A$/d | s/\v^(\S+\s+\S+).*/\1/
  • v/A$/d删除所有不以A
  • 结尾的行
  • |添加另一个命令
  • s/\v^(\S+\s+\S+).*/\1/使用非常神奇的模式\v来减少所需的\,就像-E选项
  • 一样

答案 2 :(得分:0)

使用sed查找匹配项和awk只打印所需的字段:

sed -n -e '/A$/p' input_file | awk '{print $1 $2}'

sed -n默认表示不打印任何内容。 /A$/p表示打印最后一个字符为&#39; A&#39;。

的任何内容