web-dev-qa-db-ja.com

Grepの正確な桁数とその他の文字

カンマまたはダッシュで区切られた5桁の数字を含むファイルを解析したいのですが、次のような行です。
12345,23456,34567-45678,12345-23456,34567

私の目標は、間違ったフォーマットの行を見つけることです。カンマまたはダッシュ以外の文字で区切られた5桁で構成されていない数字を含む行。

私はファイルをegrepしようとしました:

cat file.txt | egrep -v [-,]*[0-9]{5}[,-]*

  • 6桁の番号がある場合、一致し、行は表示されません
  • 4桁の番号がある場合は一致しませんが、同じ行の他の番号は一致し、行は表示されません

行の内容を指定するには:

  • 数字は5桁でなければなりません
  • 範囲は12345-12389のようにダッシュで定義されます
  • 行には、単一の数値から複数の数値および範囲を任意の順序で含めることができます

何か提案がありますか?

5
mazs
grep -vxE '([0-9]{5}[,-])*[0-9]{5}'

不正な行を報告します。

または、禁止する場合は12345-12345-12345

num='[0-9]{5}'
num_or_range="$num(-$num)?"
grep -vxE "($num_or_range,)*$num_or_range"
10

grepの適切な解決策については、 ステファンの回答 を参照してください。代わりに、これはPerlのものです:

Perl -ne 'print if grep{$_!~/^\d{5}$/} split(/[,-]/); ' file 

これは、,または-で各入力行を分割し、正確に5つの数値で構成されていない分割配列のメンバーを探します。見つかった場合は、その行が出力されます。

5
terdon

catは必要ありません。これはあなたが望むことをしますか:

 $ grep -v -E '^([0-9]{5}(,|-))+' <FILE>

たとえば、FILEに次の内容がある場合:

12345,23456,34567-45678,12345-23456,34567
1,2
12345*23456,34567-45678,12345-23456,34567
123456
1234*23456,34567-45678,12345-23456,34567

結果は次のようになります:

$ grep -v -E '^([0-9]{5}(,|-))+' 5d
1,2
12345*23456,34567-45678,12345-23456,34567
123456
1234-23456,34567-45678,12345-23456,34567
3