ファイルのアドレスフィールドの検証を構築しようとしています。
ファイルは次のようになります。
123 Strata Ln.
15 138th Ave
27 Hilltop Dr. Apt. 7
F52 Milk Ln.
156A Fantastic St.
56 sample Ln.
条件は次のとおりです。
数字 - 少なくとも1桁以上、その後に追加の数字が続きます。
距離名 - 大文字または数字で始まり、その後に小文字と大文字、数字、またはピリオド(.)が続く任意の数の単語(少なくとも1つ)
編集:これらの条件では、ファイルの最初の3行のみが有効です。
私が試したことは次のとおりです。
'^[[:digit:]][[:digit:]]+ ([[:upper:]]|[[:digit:]])([[:alphabet:]]|[[:digit:]])+\.$'
しかし、うまくいかないようです。助けが必要ですか?
答え1
少なくとも1つの数字、その後に任意の数字の追加の数字が続きます。
+
すでに「1つ以上」なので、[[:digit:]][[:digit:]]+
少なくとも2つが必要です。だから[[:digit:]]+
。
それぞれ大文字または数字で始まり、その後に任意の数の小文字と大文字、数字、またはピリオド(.)が続く単語(少なくとも1つ)
大文字または数字:括弧内に両方の文字クラスを使用できるため、ここでは[[:upper:][:digit:]]
()を交互に使用する必要はありません。|
[[:alphabet:]]
有効な文字クラスではありませんが、alpha
and alnum
(文字または数字用)があります。後者が役に立つかもしれません。
一文で:[[:upper:][:digit:]][[:alnum:].]*
各単語の前にスペースがある複数の単語(前の数字の後のスペースも処理可能):([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+
行全体を一致させるには、最後に^
andを追加するか、を使用します。誤って残りやすい末尾のスペースを許可するには、最後(前)に追加する必要があります。$
grep -x
[[:blank:]]*
$
これにより、サンプル入力の最初の3行だけが印刷されます。
grep -E '^[[:digit:]]+([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+$' file
正規表現を使用するためのオンラインツールがあります。https://regex101.com/
これはテストに役立ちます。上記の要件は(代替案が醜いためgrep -E
)ですが、regex101は単純な基本正規表現を+
許可しないと思います。grep