유닉스 파일에서 공백 / 빈 줄을 제거하는 방법 (공백 포함)?


60

명령 행을 사용하여 Unix / Linux의 파일에서 빈 / 공백 (공백 만 포함) 행을 제거하려면 어떻게해야합니까?

file.txt의 내용

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

원하는 출력

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD



1
이 꽤 많이 그렙, 나오지도, AWK를 사용하여 모든 가능한 솔루션을 제공 서사시 대답 : stackoverflow.com/questions/16414410/...
wisbucky

답변:


86

이 sed 라인은 트릭을 수행해야합니다.

sed -i '/^$/d' file.txt

-i이 현재 위치에서 파일을 편집 것을 의미합니다.


13
공백 만 포함 된 행을 제거하려면 실제로 "/ ^ * $ / d"여야합니다.
Sean Reifschneider

2
@SeanReifschneider이 답변이 작성 될 때 그 요구 사항이 질문에 없었습니까?
kasperd

4
@SeanReifschneider "/ ^ \ s * $ / d"가 탭을 포함하는 것보다 낫지 않습니까? 원래 게시물에 언급되지 않았지만 더 강력한 옵션 인 것 같습니다.
mrswadge


나는 얻는다bad flag in substitute command: 'e'
ishandutta2007

29

grep

간단한 해결책은 아래와 같이 grep( GNU 또는 BSD ) 명령을 사용하는 것입니다.

  • 빈 줄을 제거하십시오 (공백이있는 줄은 제외).

    grep . file.txt
    
  • 공백이있는 줄을 포함하여 완전히 빈 줄을 제거하십시오.

    grep "\S" file.txt
    

참고 : 원치 않는 색상이 표시되면 grep별명입니다 grep --color=auto(에 의해 확인 됨 type grep). 이 경우 --color=none매개 변수 를 추가 하거나 명령을 \grep(별칭 무시) 로 실행하면됩니다 .


ripgrep

와 비슷합니다 ripgrep(더 큰 파일에 적합).

공백이있는 줄을 포함하지 않는 빈 줄을 제거하십시오.

rg -N . file.txt

또는 공백이있는 줄 포함 :

rg -N "\S" file.txt

또한보십시오:


2
grep .가장 간단한 해결책 인 것 같습니다.
Leo

grep .다른 솔루션과 비교할 때 단점은 모든 텍스트를 빨간색으로 강조 표시한다는 것입니다. 다른 솔루션은 원래 색상을 유지할 수 있습니다. 비교 unbuffer apt search foo | grep .unbuffer apt search foo | grep -v ^$
wisbucky

1
@wisbucky 시스템에서 grep별칭이 지정되어 있기 때문에 색상 이 grep --color=auto표시됩니다 (다음으로 확인 type grep). 이를 실행 \grep하거나 --color=none매개 변수를 사용할 수 있습니다 .
kenorb

당신이 사용하는 경우 @kenorb grep --color=none .: (예를 들어, 원래 명령의 색 서식을 무시 모두 흰색 텍스트를 얻을 것이다 apt search foo)
wisbucky

grep .OP는 바람직하지 않은 공백 만 포함하는 행과 일치합니다.
Jim L.

27
sed '/^$/d' file.txt

d는 행을 삭제하는 sed 명령입니다. ^$빈 줄, 줄 시작 및 줄 끝만 일치하는 정규식입니다.


설명을 +1
Alex Raj Kaliamoorthy

이 명령은 요청 된 OP와 동일한 출력을 생성하지 않습니다 (4 개가 아닌 5 개 라인을 생성 함).
kenorb

22

grep과 함께 -v 옵션을 사용하여 일치하는 빈 줄을 제거 할 수 있습니다.

이렇게

grep -Ev "^$" file.txt

4
-E적어도 GNU grep 이 아니라는 것이 필요하다고 생각하지는 않지만 grep 로이 작업을 수행하게되어 매우 기쁩니다! 매번 sed보다 선호하는 것입니다. 인라인 필터는 인라인 편집기보다 나을 것 같습니다.
MadHatter

주석이 달린 빈 줄을 건너 뛰려면, 특히 conf 파일을 다루는 동안grep -Ev '^#|^$' file.txt
Govind Kailas

7

awk해결책 은 다음과 같습니다 .

awk NF file.txt

Awk를 사용하면 NF공백이 아닌 줄에만 설정하십시오. 이 조건이 일치하면 Awk 기본 조치는 전체 행을 인쇄하는 것입니다.


6

빈 줄을 제거하려면 다음을 사용하여 새 줄 반복을 꽉 쥐십시오 tr.

cat file.txt | tr -s '\n' '\n'

OP가 요청한대로 4 개가 아닌 6 개 라인을 생성합니다.
kenorb

1

공백을 제거하는 것이 마음에 들지 않으면 xargs

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four

0

예 / Vim

다음은 ex편집기 (Vim의 일부)를 사용하는 방법입니다 .

ex -s +'v/\S/d' -cwq test.txt

여러 파일의 경우 (제자리에서 편집) :

ex -s +'bufdo!v/\S/d' -cxa *.txt

참고 : :bufdo명령은 POSIX 가 아닙니다 .

파일을 수정하지 않고 (표준 출력으로 인쇄) :

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

0

저에게 @ martigin-heemels 명령은 오류를 던졌습니다 (예 : 더미 매개 변수 i).

sed -i '' '/^$/d' file.txt


0

공백없이 빈 줄을 제거하는 가장 쉬운 방법은 다음을 사용하는 것입니다 cat -s.

$ cat -s file
$ some-command | cat -s

적어도 파일을 편집하지 않고 대신 터미널에 쓰는 경우. 또한 재미있는 정규식 사업이 포함되어 있지 않기 때문에 비 친숙한 사람들조차도 쉽게 기억할 수 있습니다.


보낸 사람 man cat:

-s, --squeeze-blank never more than one single blank line

다른 OS에서는 다를 수 있지만 지난번에 확인했을 때 몇몇 Linux 및 OpenBSD에는있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.