だからテキストファイルがあります。
4556 4618 7843 8732
4532 0861 1932 5122
3478 893* 6788 6312
5440 3173 8207 0451 67886
6011 2966 7184 4668
3678 3905 5323
2389 4387 9336 2783
239 235 453 3458
182 534 654 765
4485 0721 1308 2759
46759 543 2345
私は4桁の数字を一緒に4回連続して(スペースで区切って)探したいと思います。
たとえば、4556 4618 7843 8732
私は以下を使用しています: grep -E "([0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4})" test.txt
これは私に次のように伝えます。
4556 4618 7843 8732
4532 0861 1932 5122
5440 3173 8207 0451 67886
6011 2966 7184 4668
4485 0721 1308 2759
この機能を使用すると、5番目の数値セットと最後に5桁の数字が含まれているため、表示しない追加の行が生成されます。
だから私は以下を使用しました。 grep -E "([0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4})$" test.txt
ただし、これは4つの結果の代わりに2つの結果のみを提供します。
4556 4618 7843 8732
4485 0721 1308 2759
誰かが私が間違っていることを教えてもらえますか?
答え1
$ grep -E '^[[:blank:]]*[0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4}[[:blank:]]*$' file
4556 4618 7843 8732
4532 0861 1932 5122
6011 2966 7184 4668
4485 0721 1308 2759
あなたの表現は4行に一致します以上スペースで区切られた4桁のグループ。括弧は式で何もしません。
上記の式は、パターンを行の先頭と末尾に固定し、最初の数値セットの前と最後の数値セットの後にスペースまたはタブのみを許可します。
^
アンカーポイントを使用する代わりに、次のものを使用$
できますgrep -x
。
grep -Ex '[[:blank:]]*[0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4}[[:blank:]]*'
これを減らして、ジェフが示すように、
grep -Ex '[[:blank:]]*([0-9]{4} ){3}[0-9]{4}[[:blank:]]*'
答え2
すでに線の終点に中間点に達しています$
。線の先頭も固定します^
。先行スペースを使用できるようですので、次の点も考慮してください*
。
grep -E "^ *([0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4})$" test.txt
入力(または理解)を簡素化するのに役立つ場合は、最初の3つのモードを組み合わせることができます。
grep -E "^ *([[:digit:]]{4} ){3}[[:digit:]]{4}$"
...数量3個(4桁の数字の後に空白)、空白、4桁の数字、EOLが必要であるという意味です。