고쳐 쓰다: 행 번호 요구 사항을 명확히 하고 일부 긴 내용을 줄입니다.
명령줄에서 다음과 같은 방법이 있습니까?
- 영문 텍스트 파일 확인
- 반복되는 단어의 맞춤법 오류를 찾아보세요.
- 그리고 발견된 줄 번호,
문제를 바로잡는 데 도움을 주려고요?
실시예 1
현재 기사나 기타 영어 작문에 도움을 주어 aspell -c text.txt
철자 오류를 찾는 데 도움이 됩니다. 하지만 실수가 의도치 않게 단어를 연속적으로 반복하는 경우에는 도움이 되지 않습니다.
highlander_typo.txt
:
There can be only one one.
달리기 aspell
:
$ aspell -c highlander_typo.txt
아마도 aspell
이것은 문법 검사기가 아닌 맞춤법 검사기이기 때문에 철자가 틀린 단어를 반복하는 것은 의도된 기능 범위를 벗어납니다. 따라서 aspell
개별 단어 철자에 관한 한 "오류"가 없기 때문에 파일이 검사를 통과하게 됩니다 .
올바른 문장은There can be only one.
, 두 번째 one
는 의도하지 않은 반복 단어 철자 오류입니다.
실시예 2
그러나 또 다른 경우는 다음과 같습니다 kylie_minogue.txt
.
La la la
여기서 반복하는 것은 작가의 일부이므로 오타가 아닙니다.노래 가사.
따라서 솔루션은 자체적으로 어떤 것도 가정하고 "수정"해서는 안 됩니다. 그렇지 않으면 의도적으로 반복되는 단어를 덮어쓸 수 있습니다.
예 3: 여러 줄
jefferson_typo.txt
:
He has has refused his Assent to Laws, the most wholesome and necessary
for the public good.
He has forbidden his Governors to pass Laws of immediate and
and pressing importance, unless suspended in their operation till his
Assent should be be obtained; and when so suspended, he has utterly
neglected to attend to them.
다음에서 수정됨독립선언서
위의 6줄에서
- 1:
He has has refused
이어야 합니다He has refused
. 두 번째는has
반복되는 단어 맞춤법 오류입니다. - 5:
should be be obtained
이어야 합니다should be obtained
. 두 번째는be
반복되는 단어 맞춤법 오류입니다.
그런데 세 번째로 반복되는 단어의 철자가 틀린 것을 발견하셨나요?
- 삼:
... immediate and
- 4:
and pressing ...
이 역시 다른 줄에 있더라도 여전히 같은 영어 문장의 일부인데, 이전 줄의 끝에 단어가 실수로 다음 줄의 시작 부분에 추가되는 경우가 있기 때문에 반복 단어 철자 오류입니다. 반복은 텍스트의 양면에서 발생하기 때문에 육안으로는 감지하기 어렵습니다.
예상 출력
유사한 프로세스를 가지고 있지만
aspell -c
반복되는 단어를 감지할 수 있는 대화형 프로그램, 또는줄 번호와 의심되는 반복 단어를 추출할 수 있는 스크립트 또는 명령 조합입니다. 이 정보를 사용
vim
하면 반복되는 단어로 이동하고 적절한 위치에 수정하는 등 편집기 사용이 더 쉬워집니다 .
위의 여러 줄을 사용하면 jefferson_typo.txt
원하는 출력은 다음과 유사합니다.
1: has has
3: and
4: and
5: be be
또는:
1: He [has has] refused his Assent to Laws, the most wholesome and necessary
3: He has forbidden his Governors to pass Laws of immediate [and]
4: [and] pressing importance, unless suspended in their operation till his
5: Assent should [be be] obtained; and when so suspended, he has utterly
실제로 위의 반복과 같이 줄 사이나 줄 간에 단어가 반복되는 어려운 경우를 어떻게 표시해야 할지 잘 모르겠습니다. and
따라서 솔루션이 이와 정확히 유사하지 않더라도 걱정하지 마세요.
그러나 위에서 언급한 대로 다음과 같이 표시되기를 바랍니다.
- 관련 원시 입력의 줄 번호
- 반복되는 내용에 주의를 집중시키는 방법으로, 텍스트 줄이 너무 긴 경우 특히 유용합니다.
- 컨텍스트를 제공하기 위해 전체 행이 표시되는 경우(출처: @Wildcard), 반복되는 단어를 고유한 방식으로 렌더링할 수 있는 방법이 필요합니다. 여기에 표시된 예에서는 중복 항목을 ASCII 문자로 묶어 표시합니다
[
]
. 또는grep --colors=always
컬러 터미널에 표시하기 위해 선을 모방한 일치 항목을 색칠 할 수도 있습니다.
기타 고려사항
- 텍스트는 일반 텍스트 파일로 남겨두어야 합니다.
- GUI 솔루션을 제공하지 말고 텍스트 솔루션만 제공하십시오.
ssh -X
X11 전달이 신뢰할 수 없으므로 다시 편집해야 합니다.ssh
실패한 시도
중복된 단어를 찾으려는 생각이 있었기 uniq
때문에 먼저 중복 단어 인식이 한 줄에서 작동하도록 하는 방법을 알아내는 것이 계획이었습니다.
사용하려면 uniq
먼저 한 줄에 있는 단어를 한 줄에 한 단어로 변환해야 합니다.
$ tr ' ' '\n' < highlander_typo.txt
There
can
be
only
one
one.
안타깝게도:
$ tr ' ' '\n' < highlander_typo.txt | uniq -D
아무것도 없습니다.
-D
이는 일반적으로 중복 항목을 표시하는 옵션의 경우 입력이 정확하게 중복 행이어야 하기 때문입니다 . 불행하게도 .
단어 끝에 마침표를 반복하면 one
이 사실이 무효화됩니다. 그냥 다른 라인처럼 보이는데 임의의 구두점(예: 이 마침표)을 어떻게 해결하고 tr
처리 후에 다시 추가할지 잘 모르겠습니다.
이것은 실패했습니다. 그러나 성공하면 줄의 줄 번호를 포함하는 방법이 필요합니다. 입력 파일에 수백 개의 줄이 있을 수 있으므로 이는 입력 파일의 어느 줄에서 중복 단어가 감지되었는지 나타내는 데 도움이 됩니다.
이 한 줄 처리는 아마도 파일의 모든 줄을 처리할 수 있도록 일종의 한 줄씩 여러 줄 처리를 수행하는 상위 루프의 일부일 것입니다. 그러나 불행하게도 한 줄을 넘어서도 중복 단어 인식이 문제가 되었습니다.
답변1
편집하다:설치 및 데모 추가
다음과 같은 극단적인 경우를 최소한 처리해야 합니다.
- 줄 끝(및 시작)에서 단어를 반복합니다.
- 가 자주 표시되므로 검색 시 대소문자를 구분해야 합니다
The the apple
. - 아마도 검색을 단어 구성 요소로 제한하여
( ( a + b) + c )
(반복되는 여는 대괄호와 일치하지 않을 수도 있습니다. - 완전한 단어만 일치시켜 제거할 수 있습니다.
the thesis
- 인간 언어의 경우 단어의 유니코드 문자를 올바르게 해석해야 합니다.
대체로 pcregrep
다음 솔루션을 권장합니다.
pcregrep -Min --color=auto '\b([^[:space:]]+)[[:space:]]+\1\b' file
분명히 색상과 줄 번호( n
옵션)는 선택 사항이지만 일반적으로 괜찮습니다.
설치하다
Debian 기반 배포판에서는 다음을 통해 설치할 수 있습니다.
$ sudo apt-get install pcregrep
예
다음 명령을 실행 jefferson_typo.txt
하여 확인하세요.
$ pcregrep -Min --color=auto '\b([^[:space:]]+)[[:space:]]+\1\b' jefferson_typo.txt
1:He has has refused his Assent to Laws, the most wholesome and necessary
3:He has forbidden his Governors to pass Laws of immediate and
and pressing importance, unless suspended in their operation till his
5:Assent should be be obtained; and when so suspended, he has utterly
위는 단지 텍스트 캡처이지만 색상을 지원하는 터미널에서는 일치하는 항목에 색상이 지정됩니다.
- 예 예
- 그리고
- 그리고
- 예 예
답변2
그러면 반복되는 단어(파일 이름 및 줄 번호 포함)가 포함된 줄이 인쇄됩니다.
for f in *.txt; do
perl -ne 'print "$ARGV: $.: $_" if /\b(\w+)\W+\1/' "$f"
done
여러 줄 일치의 경우 이것이 있지만 파일을 단락 단위로 빨아들이기 때문에 줄 번호를 잃게 됩니다(이것이 -00
이 옵션의 효과입니다). 두 단어 사이는 \W+
개행을 포함하여 "단어가 아닌" 문자를 나타냅니다.
perl -00 -nE '
@matches = /\b((\w+)\W+\2)/g;
while (@matches) {
($match,$word) = splice @matches, 0, 2;
say "dup: $match";
}
' jefferson_typo.txt
dup: has has
dup: and
and
dup: be be
답변3
존경할만한 사람들을 만나야 해diction(1)
그리고style(1)
주문하다. 그들은 온갖 종류의 야유를 받았습니다. 새 버전이 있습니다(Fedora 23의 GPLv3).
설치하다
예를 들어 Debian 기반 배포판에서는 다음을 diction
포함한 패키지를 설치합니다 style
.
$ sudo apt-get install diction
적어도 Fedora에서는 다음과 같습니다.
$ dnf install diction
Red Hat Enterprise Edition(및 클론)에는 다음이 필요할 수 있습니다.
$ yum install diction
어쨌든 이것은 다음과 같은 업스트림 GNU 패키지에서 나온 것입니다.diction
, 따라서 거의 모든 곳에서 동일하게 호출되어야 합니다.
예
$ diction jefferson_typo.txt
jefferson_typo.txt:1: He has [has] refused his Assent to Laws, the [most] wholesome and necessary for the public good.
jefferson_typo.txt:3: He has forbidden his Governors to pass Laws of immediate and [and] pressing importance, unless suspended in their operation till his Assent should be [be] obtained; and when [so] suspended, he has utterly neglected to attend to them.
2 phrases in 2 sentences found.
이점
- 무엇보다도 반복되는 단어를 잡아보세요
결점
[]
반복되는 단어와 관련되지 않은 항목에 대한 마커를 도입합니다 . 예를 들어[so]
, 관련성이 없는 것으로 간주될 수 있으므로 플래그가 지정될 수 있습니다.Strunk의 "스타일 요소". 바라보다man diction
- 표시되는 숫자는 항상 원래 입력의 줄 번호가 아니라 문장이 시작되는 줄 번호입니다. 예를 들어
[be]
원래 입력의 줄 번호는 5인데 여기서는 왜냐하면 가 line 에서 시작하는 문장의 일부이기3
때문만 표시합니다 . 그래서 이것은 당신이 원하는 것과 약간 다릅니다[be]
3
답변4
질문에 로 태그를 지정했으므로 awk
그냥 을 사용하는 것이 어떨까요 awk
?
$ awk '
BEGIN{RS=FS="\\W+"}
$0==t{printf("%s:%s\t%s %s\n", FILENAME, FNR, t, $0)}
{t=$0}
' *.txt
highlander_typo.txt:6 one one
jefferson_typo.txt:3 has has
jefferson_typo.txt:29 and and
jefferson_typo.txt:42 be be
kylie_minogue.txt:3 la la
시각적으로 도움이 되지 않아서 줄 바꿈을 지키지 않았지만 jefferson_typo.txt
, 입맛에 맞게 조정하시면 됩니다.