Grep은 추가 줄을 표시합니다

Grep은 추가 줄을 표시합니다

그래서 텍스트 파일이 있습니다.

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이 필요하다는 의미입니다.

관련 정보