正規表現で一意の一致のみを印刷するには?

正規表現で一意の一致のみを印刷するには?

次のテキストを含むファイルがあるとします。

  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

(あ、ところで編集者が質問を少し変えましたね。)

各出力行のコピーを1つだけ印刷する簡単な方法は、パイプ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+$。次に、一致する各行の最初の一意のインスタンスのみを維持しながら、すべての重複一致を削除します。

関連情報