3

さまざまな郵便番号のファイルがあります。

12345
12345-6789
1234567890
12345:6789
12345-7890
12:1234678

12345またはの形式のコードにのみ一致させたいが、12345-6789他のすべての形式は無視したい。

私の正規表現は次のとおりです。

grep -E '\<[0-9]{5}\>[^[:punct:]]|\<[0-9]{5}\>-[0-9]{4}' samplefile

12345-6789「or」句がその特定の句に一致するため、これは一致します。12345私の表現は「5つの数字に一致するが句読点は無視する」と言うべきなので、なぜ最初に一致しないのか混乱しています。

4

2 に答える 2

9

目的の出力に一致する式は次のとおりです。

egrep "^[0-9]{5}([-][0-9]{4})?$" samplefile

式の内訳:

^[0-9]{5}-5桁で始まる行を検索します。^行の先頭を[0-9]{5}意味し、0から9までの正確に5桁を意味します。

([-][0-9]{4})?$-ダッシュと4桁で終わるか、まったくない場合があります。()式をグループ化し[-]、ダッシュ文字を[0-9]{4}表し、0から9までの正確に4桁を?表し、グループ化された式が完全に存在するか存在しないかを示し$、行の終わりを示します。

test.dat

12345
12345-6789
1234567890
12345:6789
12345-7890
12:1234678

テストデータで式を実行する:

mike@test:~$ egrep "^[0-9]{5}([-][0-9]{4})?$" test.dat 
12345
12345-6789
12345-7890

追加情報:grep -Eまたは、と書くこともできますegrep。これgrep -Fは、と同じで、と同じであるfgrep場合にも機能grep -rrgrepます。

于 2013-02-14T05:46:14.393 に答える
0

「12345」には一致しませんが、「12345a」には一致します。最初の句は、あなたが書いたように、句読点以外の文字で終わる必要があります。

マイクの答えを考えてみましょう。それはより明確です。

于 2013-02-14T05:49:47.707 に答える