我有一系列的线条表格。
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只替换了第一个匹配,这是正确的:
$ 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当然,一开始的.*会贪婪地去看最后一场比赛:
$ 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中有更好的方法吗?
$ cat x | sed -n 's/\<\([A-Za-z]\+-[0-9]\+\)/\1<~id>/;s/.*\(.*\)<~id>.*/\1/;p'
HR-1
HR-2
HR-3
Cov-4发布于 2020-03-11 02:41:45
对于GNU awk,请尝试:
gawk -v FPAT='[A-Za-z]+-[0-9]+' '$1{print $1}' FILE或者:
gawk -v FPAT='[A-Za-z]+-[0-9]+' '$0=$1' FILE发布于 2020-03-11 02:40:10
使用sed时,请尝试:
删除所需匹配后的所有内容。现在匹配在每一行的末尾--这可以通过各种方式来处理。上面的内容很容易读--在每次匹配之前放置一个不属于匹配的char,然后使用第二个s命令删除到最后一个D10的所有内容。第二个s命令的另一个选项是删除不属于匹配的字符的所有内容:发布于 2020-03-11 13:43:47
使用Perl,我们可以这样做:
$ perl -lne 'print /([a-z]+-\d+)/i' file输出:
HR-1
HR-2
HR-3
Cov-4https://unix.stackexchange.com/questions/572258
复制相似问题