
数字を繰り返すことなく、すべての数字シーケンスに一致する正規表現を探したいと思います。例:
198345 - >一致します。
198315 - >一致しない(1が2回繰り返される)
どうやってこれを達成できますかgrep\egrep
?
答え1
興味深い質問です。ありがとうございます。私はこの答えが少し不気味だと思います。
egrep -v '([0-9])[0-9]*\1'
パターンは数字の発生を見つけて[0-9]
保存し\1
、重複しないことを確認します。したがって、同じ数字が続くランダムな数字を探します。-v
駅として使用
答え2
これに正規表現を使用する必要がある場合は、次を参照してください。同様の質問に対するStephenの素晴らしい答え。
正規表現が必要ない場合は、Perl の代替手段を提供します。
perl -nle '
$digits{$_}++ for /([0-9])/g;
@repeated = grep { $digits{$_} > 1 } keys %digits;
print @repeated? "":"$_"
%digits = ();
' your_file
これはyour_file
、1行に1つの数字があると仮定し、数字が一意の数字のみを印刷します。
答え3
編集する:
次の同じ数字は連続して表示する必要があります。 1123456(連続1)と一致しますが、1213456(非連続1)は一致しません。
不都合な解決策は次のとおりです。
cat testfile | grep [0-9] | grep -v "0\{2,\}" | grep -v "1\{2,\}" | grep -v "2\{2,\}" | grep -v "3\{2,\}" | grep -v "4\{2,\}" | grep -v "5\{2,\}" | grep -v "6\{2,\}" | grep -v "7\{2,\}" | grep -v "8\{2,\}" | grep -v "9\{2,\}"
最初のものはgrep
数字と一致し、残りの10個はgrep
各数字が一度だけ表示されることを確認します。
より簡潔だが、まだ不都合な方法は次のとおりです。
cat test | grep [0-9] | grep -v "1\{2,\}\|2\{2,\}\|3\{2,\}\|4\{2,\}\|5\{2,\}\|6\{2,\}\|7\{2,\}\|8\{2,\}\|9\{2,\}\|0\{2,\}"
testfile
1行に1つの単語が必要です。
答え4
grep '\([[:digit:]]\) *\1 *\1'
数字が必要[[:digit:]]
で、それを覚えています\( ... \)
。その後、スペースの数*
(スペースなしを含む)、記憶された文字\1
、スペースの数、記憶された文字を一致させようとします。これを実行して、--color=auto
一致する入力部分を確認できます。