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
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]
に置き換えることができます。
私は正規表現が好きですが、私は過剰な指定を避けるを好んでいます。この特定のデータセット(既知のデータ形式、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}$'