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

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


次の行を使用して、カンマまたはダッシュで区切られた5桁の数字を含むファイルを解析したいと思います。

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

次のコマンドを使用してファイルをegrepしようとしました。

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

  • ただし、6桁の数字がある場合は一致し、その行は表示されません。
  • 4桁の数字がある場合は一致しませんが、同じ行の他の数字は一致し、行は表示されません。

行の内容を指定するには、次のようにします。

  • 番号は5桁でなければなりません。
  • 範囲はダッシュとして定義されます(例:12345-12389)。
  • 1行には、1つの数字から複数の数字および範囲まで、任意の順序で含めることができます。

どんな提案がありますか?

答え1

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"

答え2

良いgrep解決策については、以下を参照してください。スティーブンの答え。あるいは、Perlのバージョンは次のようになります。

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

,これは、各入力行を分割するか、-5つの数字を含まない分割配列のメンバーを探します。見つかった場合は、その行を印刷します。

答え3

あなたは必要ありません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

関連情報