텍스트 파일에서 시각적으로 빈 줄을 제거하는 방법은 무엇입니까?

텍스트 파일에서 시각적으로 빈 줄을 제거하는 방법은 무엇입니까?

나는 여러 개의 텍스트 파일을 가지고 있는데 그 중 일부에는 빈 줄, 즉 개행 문자만 포함되어 있거나 공백 뒤에 개행 문자가 올 수도 있습니다. 명령을 사용하여 이러한 파일을 찾습니다 find.

  • 샘플 파일
    #Title 1
    12345678 1234
    
    #Title 2
    12345678 1234
    12345678 1234
    
    
    
    
    
    
    
    
  • 예상 출력
    #Title 1
    12345678 1234
    #Title 2
    12345678 1234
    12345678 1234
    

이러한 빈 줄을 모두 제거하고 싶습니다. 다음 명령을 사용하여 Debian Linux Stretch에서 시도했습니다.

cat "/path/to/file" | sed '/^\s*$/d' | sponge "/path/to/file";

예를 들어, 일부 파일에는 4개 이상의 빈 줄이 있지만 위 명령은 뒤의 빈 줄 중 하나만 제외하고 모두 제거합니다.

마지막 빈 줄을 어떻게 제거합니까? 위에서 언급했듯이 파일에 여전히 빈 줄이 있으면 이 줄도 제거해야 합니다.

파일이 BASH 변수의 정렬된 배열에 저장되므로 파일 간의 일관성을 얻으려고 합니다. 그런 다음 파일을 반복하고 모든 빈 줄과 후행 빈 줄을 제거합니다. 반면 일부 파일에는 이미 빈 줄이나 후행 빈 줄이 없습니다.

답변1

귀하의 질문을 올바르게 이해했다면 텍스트 파일에서 (실제 또는 시각적으로) 빈 줄을 제거하고 싶습니다. 이는 Easy 를 사용하여 수행할 수 있습니다 awk.

단일 파일의 경우 호출할 수 있습니다.

awk 'NF' /path/to/file

이렇게 하면 해당 줄에 "공백이 아닌" 문자가 하나 이상 포함된 파일만 인쇄됩니다. 이에 대한 아이디어는 awk입력 줄이 기본적으로 "공백"에서 "필드", 즉 연속 공백과 탭으로 분할된다는 것입니다. 그러나 행에 해당 문자만 포함된 경우 자동 변수에 내부적으로 저장된 필드 수는 NF"0"으로 인식됩니다. 위의 (다소 짧은) 프로그램은 NF현재 행을 인쇄하기 위해 0이 아니어야 한다는 조건을 부과합니다 . 이렇게 하면 실제 또는 "시각적으로" 빈 줄이 효과적으로 제거됩니다.

인라인 편집은 기본적으로 수행되지 않으므로 awk출력을 임시 파일로 리디렉션한 다음 이름을 바꾸거나 확장을 이해하는 충분히 새로운 구현을 사용해야 할 수도 있습니다 -i inplace.

awk -i inplace 'NF' /path/to/file

답변2

공백 이외의 내용을 포함하는 줄만 포함하는 또 다른 이식 가능한 방법은 다음과 같습니다.

grep '[^[:space:]]' file

다른 명령에도 동일한 접근 방식을 사용할 수 있습니다.

sed -n '/[^[:space:]]/p' file

소스와 동일한 파일에 쓰는 것은 상당히 표준적인 프로세스입니다. 일부 명령은 -i(또는 이와 동등한 것)을 사용하여 나타냅니다.제자리에편집하지만 실제로는 실제로 임시 파일에 쓴 다음 원본 파일을 임시 파일로 덮어씁니다.

some_command file >file.tmp && mv -f file.tmp file
rm -f file.tmp

file다른 곳의 하드 링크가 없는 경우 이는 매우 효과적입니다. 이 상황을 충족하려면 이중 사본이 필요합니다.

some_command file >file.tmp && cat file.tmp >file
rm -f file.tmp

답변3

안타깝게도 문제는 macOS에서만 재현할 수 있습니다. macOS에서는 패턴이 0개 이상의 문자로 구성된 모든 줄 과 일치하는 것으로 sed이해 \s됩니다 . 이것s^\s*$s포함하다빈 줄. 단, 공백과 같은 문자만 포함하는 줄은 아닙니다.


빈 줄이나 공백이나 탭만 포함된 줄을 제거하는 이식 가능한 방법은 다음과 같습니다.

grep -v -x '[[:blank:]]*' file

grep이는 일치하지 않는 행만 추출 하는 데 사용됩니다 [[:blank:]]*. 이 [[:blank:]]*패턴은 0개 이상의 공백이나 탭과 일치합니다. 더 큰 공백과 유사한 문자 세트(캐리지 리턴, 수직 탭 등 포함)를 일치시키려면 대신 를 사용하십시오 [[:space:]]*. 이 -x옵션은 grep패턴이 완전한 행과 일치하도록 강제합니다(마치 표현식을 사용하고 고정한 것처럼 ^) $.

답변4

당신이 사용할 수있는:

grep '[[:graph:]]'

최소한 하나의 그래픽 문자가 포함된 줄을 보고하므로 빈 줄이나 공백 문자, 제어 문자, 알 수 없는/정의되지 않은/잘못된 문자만 포함된 줄은 제외됩니다.

관련 정보