wc 명령이 파일 행 번호를 읽을 때 오류가 발생했습니다.

wc 명령이 파일 행 번호를 읽을 때 오류가 발생했습니다.

wc -l파일에 존재하는 줄 수를 확인 하고 있습니다 . 항상 잘 작동했지만 이번에는 그렇지 않았습니다.

120개의 큰 파일이 있는데 각 파일에는 최소한 두 줄이 있어야 합니다. 방금 이 파일에 대해 텍스트 편집 작업을 수행하고 새 줄을 제거하고 추가했습니다. wc -l *평소대로 사용하여 최종 행 수를 확인 하려고합니다 . 출력에는 대부분의 파일에 한 줄만 있는 것으로 표시됩니다.

파일 중 하나를 열었는데(명령 결과에는 한 줄만 있었습니다) vim정확하게 두 줄이 있는 것을 볼 수 있었습니다. 종료 하고 다음을 사용하여 vim다시 확인하십시오.wc -l

여기서 무슨 일이 일어나고 있는지 아는 사람 있나요? 120개의 파일을 모두 열지 않고 이 문제를 어떻게 해결할 수 있습니까 vim?

추신: 내 파일의 마지막 줄이 비어 있지 않습니다.

답변1

일반적인 Gnu 구현은 wc다음과 같습니다


'wc' 주어진 각 FILE 또는 표준 입력(아무 것도 제공되지 않거나 FILE이 '-'인 경우) 에서 바이트, 문자, 공백으로 구분된 단어 및 줄 바꿈의 수를 셉니다 .

따라서 파일에 최종 개행 문자가 없으면 출력의 "줄" 부분은 wc예상보다 1이 작아집니다. 예를 들어, 다음은 1을 출력합니다.

printf 'hello\nworld' | wc -l 

OP는 vim이 최종 줄 바꿈이 누락되었다고 보고했다는 의견을 확인했습니다. 모든 파일에 이 문제가 있는 것으로 알려진 경우 간단한 수정 방법은 다음과 같습니다.

 for f in *
 do
     echo >> "$f"
 done

각 파일에 줄바꿈을 추가합니다.

모든 파일에 줄바꿈이 누락된 경우 파일 끝에 조건부로 줄바꿈을 추가하는 한 가지 방법은 sed를 사용하는 것입니다.

sed -s -i '$s/$/\n/;P;d' *

일부 GNU 확장을 사용하여 -s각 파일을 개별적으로 처리하고 -i내부 편집을 허용하며 \n개행 문자를 표시할 수 있습니다. sed 프로그램 자체는 각 파일의 마지막 줄에 줄바꿈 문자를 추가하고 각 줄의 첫 번째 줄바꿈 문자까지 인쇄하고 다음 줄로 이동하는 것을 의미합니다.

답변2

이것은 정확한 대답은 아니지만 텍스트 파일을 정규화하기 위해 자주 사용하는 작은 개인 도구(txtnorm)를 공유합니다.

#!/usr/bin/perl -spi
our($s);
s/\n\r|\r\n|\n|\r/\n/g;                 ## normalize \n
s/^(\xFF\xFE|\xFE\xFF|\xEF\xBB\xBF)//;  ## remove BOM !
s/(?<=.)\z/\n/;                         ## ensure newline at eof

if($s){ s/\xC2\xA0/ /g }                ## -s non breaking spaces-> " "

txtnorm *.txt줄 끝을 정규화하고, eof에서 줄 바꿈을 보장하고, BOM을 제거하고, -s를 사용하여 잘림 방지 공백을 정규화할 수 있습니다.

반드시 텍스트 파일에만 사용해야 합니다.

관련 정보