ファイルの内容が長さXで、特定の文字のみが含まれていることを確認してください。

ファイルの内容が長さXで、特定の文字のみが含まれていることを確認してください。

Docker IDのみを含むファイルがあるとしましょう。

myid.id:

28fe2baadbe8da32ed0b99c69b11c01b2d141bc5b732b81e0960086de52fc891

my.id内容が正確に64文字長で、[0-9]と[az]の範囲(おそらく[af])の文字のみが含まれていることを確認したいと思います。

  • どうすればいいですか?
  • ファイルに改行文字が含まれている場合、0x0aこのチェックにそれらを含める/除外するにはどうすればよいですか?

答え1

努力する:

$ echo 28fe2baadbe8da32ed0b99c69b11c01b2d141bc5b732b81e0960086de52fc891 | 
awk '{sub(/\r/,"")} length == 64 && /^[[:xdigit:]]+$/'
28fe2baadbe8da32ed0b99c69b11c01b2d141bc5b732b81e0960086de52fc891

または代わりに使用してくださいperl

改行を含む:

perl -ne 'print if length == 64 and /^[[:xdigit:]]+$/'

改行を除く:

perl -nle 'print if length == 64 and /^[[:xdigit:]]+$/'

答え2

ライン全体をgrepingするのはどうですか?

grep -qxE '[[:xdigit:]]{64}' myid.id && echo "yes"

または(不明)bash固有

IFS= read -r id < myid.id 
[[ ${#id} -eq 64 ]] && [[ $id =~ [[:xdigit:]]{64} ]] && echo "yes"

答え3

read s <./file
[ ${#s} -eq 64 ] &&
[ -n "${s##*[![:alnum:]]*}" ] && 
echo success\!

テストを次に制限することにした場合AFその後、POSIXクラスを使用するすべてのアプリケーションに言及する[:alnum:]価値[:xdigit:]がありますが。[:alnum:] そして/または [:xdigit:]また一致しますA-[ZF]。これは仕様の一部です...これが問題の場合は、もう1つのテストを追加する必要があるかもしれません。たとえば、次のようになります。

...&& [ -n "${s##*[[:upper:]]*}" ] &&...

答え4

この試み:

 echo 28fe2baadbe8da32ed0b99c69b11c01b2d141bc5b732b81e0960086de52fc891 | grep [:0-9a-z:] |  wc -c

関連情報