
wc -l
내 파일에 존재하는 줄 수를 확인하는 데 사용되었습니다 . 항상 잘 작동했지만 이번에는 그렇지 않았습니다.
나는 각 파일에 적어도 두 줄이 있어야 하는 120개의 큰 파일을 가지고 있습니다. 방금 해당 파일에 대한 일부 텍스트 편집 작업을 수행하여 새 줄을 제거하고 추가했습니다. wc -l *
평소대로 사용하여 최종 줄 수를 확인하려고했습니다 . 출력 결과 대부분의 파일에 한 줄만 있는 것으로 나타났습니다.
파일 중 하나(명령 결과에 한 줄만 있음)를 열었고 vim
정확히 두 줄이 있음을 알 수 있습니다. 종료 vim
하고 를 사용하여 다시 확인하면 wc -l
해당 파일의 줄 수가 2로 나타납니다.
여기서 무슨 일이 일어났는지 아는 사람 있나요? 120개의 파일을 모두 여는 대신 이 문제를 어떻게 해결할 수 있습니까 vim
?
추신: 내 파일의 마지막 줄은 비어 있지 않았습니다.
답변1
일반적인 Gnu 구현은 다음과 wc
같습니다.
'wc'는 주어진 각 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를 사용하여 잘림 방지 공백을 정규화할 수 있습니다.
반드시 텍스트 파일에만 사용하세요.