regex - 在不同的行中查找一个匹配项,后跟另一个匹配项并对输出进行排序

标签 regex perl sed grep xargs

我有一个采用以下格式的文件:

First Name : aa
#some noninteresting info
...
#some noninteresting info
Last Name : tt
First Name : cc
#some noninteresting info
...
#some noninteresting info
Last Name : ss

我需要生成另一个文件,其中只有名字和姓氏,并根据姓氏排序:

First Name : cc
Last Name : ss
First Name : aa
Last Name : tt

我尝试了以下方法:

grep "Last Name :" | sort 

但这只是我想要的一半。如何将名字添加到与姓氏相对应的名称中,并根据姓氏对它们进行排序?

最佳答案

如果您有 GNU sed,那么您可以通过管道将 grep 的输出传送给它。

grep -E '(First|Last) Name' file | sed 'N;s/\n/ /' | sort -k8 | sed 's/Last/\nLast/'
First Name : cc
Last Name : ss
First Name : aa
Last Name : tt
  • grep -E '(First|Last) Name' file 将 grep 包含名字和姓氏的行
  • sed 'N;s/\n//' 会将姓氏附加到名字
  • sort -k8 将排序第 8 个字段,即姓氏值
  • sed 's/Last/\nLast/' 会将它们放在单独的行上

如果您没有 GNU sed,那么您的另一个选择是使用 xargs:

grep -E '(First|Last) Name' file | xargs -n8 | sort -k8 | xargs -n4
First Name : cc
Last Name : ss
First Name : aa
Last Name : tt

注意:这假设您的数据的每个条目都有名字和姓氏。 xargs 解决方案假定您的名字没有中间名

关于regex - 在不同的行中查找一个匹配项,后跟另一个匹配项并对输出进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23484067/

相关文章:

linux - 脚本在没有执行权限的情况下执行脚本

bash - 使用 sed 或 awk 从绝对路径中提取目录名称

linux - 提取两个行号之间的文本

Python positive-lookbehind 拆分可变宽度

python - pyserial 连接有效,但如何使用 ser.readline() 处理输出?

java - 在 PHP 上使用 RegEx 时遇到的问题

PHP 搜索字符串中的大写+小写混合单词?

Perl IO::Socket/IO::Select - 从 "ready-to-read"套接字读取

regex - 如何使用 Perl 有选择地修改 HTML 文档中脚本标记的 src 属性?

sed - 如何用特定值 "XYX"替换 csv 文件的第二列