ファイル内のGUIDのみを検索する - Bash

ファイル内のGUIDのみを検索する - Bash

GUIDを含むことができるファイルがあります(それらの標準テキスト表現)。

ファイル内の各GUIDに対してタスクを実行したいと思います。 GUIDは任意の数だけ含めることができます。

読みやすいファイルが用意されています。 GUIDを見つける方法は?

私はそれを使用しなければならないことを知っている。while read FILENAME

私のファイルの例:

GUIDs
--------------------------------------
cf6e328c-c918-4d2f-80d3-71ecaf09bf7b
91d523b0-4926-456e-a9d2-ade713f5b07f
(2 rows)
// THERE IS AN EMPTY LINE HERE AFTER NUMBER OF ROWS

答え1

GNUで実装grep(または互換性):

<your-file grep -Ewo '[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}' |
  while IFS= read -r guid; do
    your-action "$guid"
    sleep 5
  done

これらのGUIDは、入力のどこにでも見つけることができます(前後に来ない場合)。単語文字)。

GNUには、正規表現の空でない一致を印刷するオプションがgrepあります。-o

-w完全な単語にのみ一致するSysVの別の非標準拡張です。一致するテキストが単語以外の単語と単語文字の間の遷移と、単語文字が英数字または下線付きの単語と単語以外の文字の間の遷移の間にある場合にのみ一致します。これは、次のものと一致するのを防ぐためです。

あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ

残りは標準のPOSIX構文です。 ABCDEFも一致します[[:xdigit:]][0123456789abcdef]小文字のGUIDのみを一致させるには。

答え2

私は正規表現が好きですが、過度の仕様を避ける。この特定のデータセット(既知のデータ型、行ごとに1つのGUID、ヘッダー、フッター)の場合、単にヘッダー/フッターを削除しました。

$ cat guids.txt | egrep -v 'GUIDs|--|rows|^$' |
    while read guid ; do
      some_command "$guid"
      sleep 5
    done

あるいは、目的の行を見つけながら、現在のデータセットの正規表現をできるだけ簡単にすることもできます。

egrep '^[0-9a-f-]{36}$'

関連情報