두 개 이상의 점이 있는 선 추출

두 개 이상의 점이 있는 선 추출

두 개 이상의 점이 있는 (파일에서) 줄을 추출(또는 계산)해야 합니다. 이 줄은 점으로 시작하면 안 됩니다.점이 있는 경우), 두 점이 연속될 수 없습니다(즉, 점은 모두 점이 아닌 문자로 구분됩니다).

출력 예:

a.b.
a.b.com
a.b.c.
a.b.c.com

하지만:

a.com
a..b
a.b.c..d

나는 다음 명령을 실행했습니다.

grep -P '^[^.]+\.([^.]+\.)+[.]+' file.txt | wc -l

그러나 일치하는 행을 찾을 수 없습니다. 어떻게 해야 합니까?

답변1

  1. \.동일 하며 [.]둘 다 다른 문자가 아닌 리터럴 포인트와 일치합니다. 스타일에 관한 한 하나를 선택하고 고수하십시오.
  2. 문제는 정규 표현식(예: 패턴) ([^.]+\.)+뒤에 가 있다는  것입니다. 이는 실제로 가 뒤에 오는  [.]+것과 동일하며 결과적으로 grep은 을 포함하는 줄, 즉 연속된 두 개의 점을 찾고 있습니다. 확인해 보면 명령이 일치하는 것을 알 수 있습니다.[^.]+\.[.]text.text..a.b..
  3. 좋습니다. 수정 사항은 매우 간단하다고 생각합니다.
    grep -P '^[^.]+\.([^.]+\.)+[^.]*$'
    즉, [.]로 변경하고 (원래 의도 한 [^.]것일 수도 있음) 다음을 로 변경하고 을 추가합니다 . 특정 수의 그룹 뒤에는 점 이외의 숫자(0개 이상) 문자가 필요/허용됩니다. 선.+*$text.
  4. 더 간단한 방법(이해하기 쉬움)은 다음과 같습니다.
    grep -P '^[^.]+\..*\.'file.txt | grep -v '\.\.'
    첫 번째는 grep점이 아닌 문자로 시작하고 최소 두 개의 점이 포함된 행을 찾습니다. 두 번째는 grep두 개의 연속 점이 있는 행을 제거합니다.
  5. 그렇게 하기 보다는 grep … | wc -l, 그렇게 하세요 grep -c ….

답변2

사용 awk:

$ cat file
.com
.c.c.c.c
a.b.
a.b.com
a.b.c.
a.b.c.com
a.com
a..b
a.b.c..d
$ awk -F . 'NF > 2 && !/^\./ && !/\.\./' file
a.b.
a.b.com
a.b.c.
a.b.c.com

여기서 프로그램은 awk점을 필드 구분 기호로 사용합니다. 두 개 이상의 점이 있는 선은 세 개 이상의 필드가 있는 선과 같습니다. 이것이 NF > 2테스트가 테스트하는 것입니다. 첫 번째 정규식은 점으로 시작하는 줄을 삭제하고 두 번째 정규식은 두 개 이상의 점이 연속적으로 포함된 줄을 삭제합니다. 나머지 줄을 인쇄합니다.

똑같은 것 grep:

grep '\..*\.' file | grep -v -e '^\.' -e '\.\.'

첫 번째 표현식은 최소 두 개의 점이 포함된 선을 추출하고, 다른 두 표현식은 점으로 시작하거나 두 개의 연속된 점이 포함된 선을 제거합니다.

또는 sed,

sed -n '/^\./d; /\.\./d; /\..*\./p' file

답변3

아래와 같이 주변을 둘러보면 이 작업을 수행할 수 있습니다.

$ grep -Pc '^(?!\.)(?!.*\.\..*)(?=.*\..*\.)' file.txt

읽다:

  • 줄 맨 앞에 서서 오른쪽을 보니^
  • 줄이 문자 그대로의 점으로 시작되지 않는 것을 확인했습니다.(?!\.)
  • 더 멀리 보면 두 개의 연속된 텍스트 포인트가 표시되지 않습니다.(?!.*\.\..*)
  • 하지만 두 개의 점이 보이지만 이전 예측에서 연속된 점을 제외했기 때문에 두 점이 점이 아닌 문자 하나 이상으로 구분되어야 함을 의미합니다.(?=.*\..*\.)
  • 양자전기역학

관련 정보