두 개 이상의 점이 있는 (파일에서) 줄을 추출(또는 계산)해야 합니다. 이 줄은 점으로 시작하면 안 됩니다.끝점이 있는 경우), 두 점이 연속될 수 없습니다(즉, 점은 모두 점이 아닌 문자로 구분됩니다).
출력 예:
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
\.
동일 하며[.]
둘 다 다른 문자가 아닌 리터럴 포인트와 일치합니다. 스타일에 관한 한 하나를 선택하고 고수하십시오.- 문제는 정규 표현식(예: 패턴)
([^.]+\.)+
뒤에 가 있다는 것입니다. 이는 실제로 가 뒤에 오는[.]+
것과 동일하며 결과적으로 grep은 을 포함하는 줄, 즉 연속된 두 개의 점을 찾고 있습니다. 확인해 보면 명령이 일치하는 것을 알 수 있습니다.[^.]+\.
[.]
text.text..
a.b..
- 좋습니다. 수정 사항은 매우 간단하다고 생각합니다.
grep -P '^[^.]+\.([^.]+\.)+[^.]*$'
즉,[.]
로 변경하고 (원래 의도 한[^.]
것일 수도 있음) 다음을 로 변경하고 을 추가합니다 . 특정 수의 그룹 뒤에는 점 이외의 숫자(0개 이상) 문자가 필요/허용됩니다. 선.+
*
$
text.
- 더 간단한 방법(이해하기 쉬움)은 다음과 같습니다.
grep -P '^[^.]+\..*\.'file.txt | grep -v '\.\.'
첫 번째는grep
점이 아닌 문자로 시작하고 최소 두 개의 점이 포함된 행을 찾습니다. 두 번째는grep
두 개의 연속 점이 있는 행을 제거합니다. - 그렇게 하기 보다는
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
읽다:
- 줄 맨 앞에 서서 오른쪽을 보니
^
- 줄이 문자 그대로의 점으로 시작되지 않는 것을 확인했습니다.
(?!\.)
- 더 멀리 보면 두 개의 연속된 텍스트 포인트가 표시되지 않습니다.
(?!.*\.\..*)
- 하지만 두 개의 점이 보이지만 이전 예측에서 연속된 점을 제외했기 때문에 두 점이 점이 아닌 문자 하나 이상으로 구분되어야 함을 의미합니다.
(?=.*\..*\.)
- 양자전기역학