샘플 파일 받기
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
.