对于具有以下输入测试的给定文件,我想将所有名称都用姓氏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
答案 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
字符的所需名称,我们可以使用多行P
和D
命令循环,这些命令充当包含{{1字符\n
打印模式空间的第一部分,直到先前添加的换行符P
删除模式空间的相同第一部分有关多行命令中D
和P
的详情,请参阅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}'