首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取与sed一致的第一个匹配。

提取与sed一致的第一个匹配。
EN

Unix & Linux用户
提问于 2020-03-11 01:55:55
回答 3查看 1.5K关注 0票数 1

我有一系列的线条表格。

代码语言:javascript
复制
Agenda HR-1 Presented by XYZ
HR-2 Debate-1 - All
HR-3 Debate-2 - All
(Cov-4) Conclusion 

每一行都有(sed)模式[A-Za-z]\+-[0-9]\+的ID,即一个或多个字母后面跟着一个或多个数字。它们发生在线上的任何地方。

我需要提取身份证。我的想法是在开始和结束时加入一个.*,然后打印\1,但是我无法让它工作。

回复说sed只替换了第一个匹配,这是正确的:

代码语言:javascript
复制
$ cat /tmp/scratch/x | sed -n   's/\<\([A-Za-z]\+-[0-9]\+\)/ID:\1/p'
Agenda ID:HR-1 Presented by XYZ
ID:HR-2 Debate-1 - All
ID:HR-3 Debate-2 - All
(ID:Cov-4) Conclusion

当然,一开始的.*会贪婪地去看最后一场比赛:

代码语言:javascript
复制
$ cat /tmp/scratch/x | sed -n   's/.*\<\([A-Za-z]\+-[0-9]\+\).*/ID:\1/p'
ID:HR-1
ID:Debate-1
ID:Debate-2
ID:Cov-4

我认为在sed中这样做的唯一方法是在一个命令中在ID周围添加标记,然后使用另一个命令进行解压缩,如下所示。

在sed中有更好的方法吗?

代码语言:javascript
复制
$ cat x | sed -n   's/\<\([A-Za-z]\+-[0-9]\+\)/\1<~id>/;s/.*\(.*\)<~id>.*/\1/;p'
HR-1
HR-2
HR-3
Cov-4
EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2020-03-11 02:41:45

对于GNU awk,请尝试:

代码语言:javascript
复制
gawk -v FPAT='[A-Za-z]+-[0-9]+' '$1{print $1}' FILE

或者:

代码语言:javascript
复制
gawk -v FPAT='[A-Za-z]+-[0-9]+' '$0=$1' FILE
票数 1
EN

Unix & Linux用户

发布于 2020-03-11 02:40:10

使用sed时,请尝试:

代码语言:javascript
复制
  • 删除所需匹配后的所有内容。
  • 现在匹配在每一行的末尾--这可以通过各种方式来处理。
    • 上面的内容很容易读--在每次匹配之前放置一个不属于匹配的char,然后使用第二个s命令删除到最后一个D10的所有内容。
    • 第二个s命令的另一个选项是删除不属于匹配的字符的所有内容:

代码语言:javascript
复制
票数 1
EN

Unix & Linux用户

发布于 2020-03-11 13:43:47

使用Perl,我们可以这样做:

代码语言:javascript
复制
$ perl -lne 'print /([a-z]+-\d+)/i' file

输出

代码语言:javascript
复制
HR-1
HR-2
HR-3
Cov-4
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/572258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档