如何仅打印正则表达式中的唯一匹配项?

如何仅打印正则表达式中的唯一匹配项?

假设我有一个包含以下文本的文件:

  1. 1号
  2. 号码_3
  3. 1号
  4. 号码_4

如何使用正则表达式每次不同的情况只打印一次号码_n?使用:

grep -oE "Number_\w+" 

给我返回所有匹配项:

1号

号码_3

1号

号码_4

但我想要以下输出:

1号

号码_3

号码_4

答案1

grep -oE "Number_\w+"  | sort -u

答案2

(哦,好吧,编辑稍微改变了问题。)

仅打印每个输出行的一份副本的简单方法是通过管道sort -u(或sort | uniq),尽管这显然会对输出进行排序。

其他相关解决方案在这里:打印独特的线条


(我最初认为这个问题的答案是:)

要仅打印与正则表达式匹配的第一个字符串,我们可以使用 grep -m1 ...

-m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines. 

如果匹配位于不同的行,则可以直接工作,但如果同一行有多个匹配的字符串,则使用-o,它们都会被打印,因此添加类似| head -1.

答案3

$ awk '{print $NF}' file | sort -u
Number_1
Number_3
Number_4

$ awk '{Arr[$NF]++}END{for(i in Arr)print i}' file
Number_3
Number_4
Number_1

答案4

使用jq

$ cat file
Number_1

Number_3

Number_1

Number_4
$ jq -n -R -r '[inputs | select(test("^Number_\\d+$"))] | unique[]' file
Number_1
Number_3
Number_4

或者,使用命令行上给出的正则表达式,

$ jq -r -R -n --arg re '^Number_\d+$' '[inputs | select(test($re))] | unique[]' file
Number_1
Number_3
Number_4

这将选择与 PCRE 正则表达式匹配的行^Number_\d+$。然后,它会删除所有重复的匹配项,同时仅保留每个匹配行的第一个唯一实例。

相关内容