使用sed在文件中查找具有给定姓氏的所有名称

时间:2016-12-20 13:17:35

标签: sed

对于具有以下输入测试的给定文件,我想将所有名称都用姓氏Smith,我已经使用grep -o -w "[A-Za-z]* Smith" filename 完成了:

sed

但我想知道如何使用sed -e 's/[A-Za-z]* Smith/&/g' filename 完成,我尝试了

John Smith Kent Smith Adam Smith
Adam Jones Devlin Thomas Bill Kate
Mark Taylor Dean Bush Kane King Nicole Smith
John Williams Adam Cole
James Brown Jason Taylor Mark Rose
Rache Davies Christian Williams
Chris Evans Steve Williams Craig Thomas Jack Smith
Jonna Wilson Jack Jones Jason Patt
Chris Thomas Connor Smith
Kat Watson Kat Smith Julia Roberts Greg Smith Bill Smith
Michael Johnson

但它正在打印整行。

输入文件文字:

brew install https://raw.githubusercontent.com/turforlag/homebrew-cervezas/master/pdftk.rb

3 个答案:

答案 0 :(得分:2)

试试这个:

sed '/[A-Za-z]* Smith/!d;s//\n&\n/;s/^[^\n]*\n//;P;D' file

<强>说明:

  • /[A-Za-z]* Smith/!d:仅保留包含字母后跟Smith
  • 的行
  • s//\n&\n/:在地址模式上方的第一个字符串匹配之前和之后添加换行符(\n
  • s/^[^\n]*\n//:删除不需要的字符串(不以\n开头的字符串)
  • 行现在只包含第一个匹配项中包含\n字符的所需名称,我们可以使用多行PD命令循环,这些命令充当包含{{1字符
  • \n打印模式空间的第一部分,直到先前添加的换行符
  • 打印后,P删除模式空间的相同第一部分

有关多行命令中DP的详情,请参阅http://www.grymoire.com/Unix/Sed.html

D绝对更适合这份工作。

答案 1 :(得分:1)

实际上,这并不像我想象的那么容易,因为$rootScope在单独的一行显示每个匹配。如果您想两次使用grep -o,可以说:

sed

答案 2 :(得分:1)

你没有问,但......

<script src="">救援!

awk

文件

$ awk -v sur="Smith" '{for(i=2;i<=NF;i++) if($i==sur) print $(i-1),sur}'