次の行を使用して、カンマまたはダッシュで区切られた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