假设我有一个包含以下文本的文件:
- 1号
- 号码_3
- 1号
- 号码_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+$
。然后,它会删除所有重复的匹配项,同时仅保留每个匹配行的第一个唯一实例。