그래서 텍스트 파일이 있습니다.
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자리 그룹입니다. 괄호는 표현식에서 아무 작업도 수행하지 않습니다.
위의 표현식은 패턴을 줄의 시작과 끝 부분에 고정하고 첫 번째 숫자 집합 앞과 마지막 숫자 집합 뒤에 공백이나 탭만 허용합니다.
^
및 앵커 포인트를 사용하는 대신 다음을 $
사용할 수 있습니다 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
입력(또는 이해)을 단순화하는 데 도움이 되는 경우 처음 세 가지 모드를 결합할 수 있습니다.
grep -E "^ *([[:digit:]]{4} ){3}[[:digit:]]{4}$"
...수량 3개(4자리 숫자 다음에 공백), 공백, 4자리 숫자, EOL이 필요하다는 의미입니다.