web-dev-qa-db-ja.com

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

GUIDが含まれている可能性のあるファイルがあります(その 正規のテキスト表現 )。

ファイル内のGUIDごとにアクションを実行したい。これには、任意の数のGUIDが含まれる可能性がある。

すでに読み取り可能なファイルがあります。 GUIDSを見つけるにはどうすればよいですか?

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
5
MathEnthusiast

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を見つけます(そして、それらの前にも後にもWord文字がない場合)。

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

-wは、SysVから出てきた非標準の拡張機能の1つであり、単語全体でのみ一致すると考えられます。一致するテキストが非WordとWordの文字の間の遷移とWordと非Wordの文字の間の遷移の間にある場合のみ一致します(Word文字は英数字またはアンダースコアです)。これは、次のようなものに対する一致を防ぐためです。

 aaaaaaaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaaaaaaaaaaa 

残りは標準のPOSIX構文です。 [[:xdigit:]]はABCDEFでも一致することに注意してください。小文字のGUIDのみを照合する場合は、[0123456789abcdef]に置き換えることができます。

5

私は正規表現が好きですが、私は過剰な指定を避けるを好んでいます。この特定のデータセット(既知のデータ形式、1行あたり1つのGUIDプラスヘッダーおよびフッター))の場合、ヘッダー/フッターを削除します。

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

または、必要な行をgrepで出力しますが、現在のデータセットの正規表現もできるだけ単純にします。

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

2
Noach