잊혀진 구두점의 의미를 찾는 방법

잊혀진 구두점의 의미를 찾는 방법

샘플 파일 받기

this is line one of a paragraph
that continues here and finishes
with a full stop as it should.

Now we have a second paragraph
that continues in a new line, 
but the full stop is missing

I simply overlooked it, typing too fast.

이러한 오류를 어떻게 감지할 수 있나요? 내 순진한 grep 방법

grep "^.*[a-zA-Z]$^$"  file.text

하다아니요일하세요(왜?).

답변1

GNU 사용 awk:

$ awk -v RS='\n\n' '$NF !~ /[[:punct:]]$/' file
Now we have a second paragraph
that continues in a new line,
but the full stop is missing

이는 레코드 구분 기호를 두 개의 개행 문자 시퀀스로 설정합니다. 이는 각 단락이 기록이 된다는 것을 의미합니다. 레코드의 마지막 필드(단어) !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~가 구두점(중 하나)으로 끝나지 않으면 단락을 인쇄합니다.

대신, 더 적절하다면 [[:punct:]]더 작은 문자 클래스를 사용할 수 있습니다 .[.!?]

출력에 단락 번호와 일부 장식 텍스트를 포함하려면 다음을 사용하십시오.

$ awk -v RS='\n\n' '$NF !~ /[[:punct:]]$/ { printf("ERROR (%d):\n%s\n", FNR, $0) }' file
ERROR (2):
Now we have a second paragraph
that continues in a new line,
but the full stop is missing

기본적으로 한 번에 한 줄씩 읽기 때문에 작동 grep하지 않습니다 . 따라서 라인 앵커 끝 이후에는 어떤 항목도 grep일치할 것으로 기대할 수 없습니다 .$

답변2

해결책 sed:

sed -n 'N;/[A-Za-z]\n$/P;D' file

이것은 표준의 수정입니다 sed 'N;P;D'. OP가 시도하고 있는 원래 정규식을 반영할 것으로 예상됩니다 grep.

관련 정보