grep으로 빈 줄 제거


164

나는 grep -v '^$'리눅스에서 시도했지만 작동하지 않았다. 이 파일은 Windows 파일 시스템에서 가져 왔습니다.

답변:


300

다음을 시도하십시오 :

grep -v -e '^$' foo.txt

-e옵션은 정규식 패턴 일치를 허용합니다.

작은 따옴표 ^$는 Cshell에서 작동합니다. 다른 쉘은 작은 따옴표 나 큰 따옴표로 만족합니다.

업데이트 : 이것은 빈 줄이나 "모든 공백"(예 : "\ r \ n"스타일 줄 끝이있는 Windows 줄)이있는 파일의 경우 위와 같이 빈 줄과 유닉스 스타일 줄 끝이있는 파일 만 제거합니다.

grep -v -e '^[[:space:]]*$' foo.txt

이 egrep은 줄에 공백이 없거나 공백이 2 개 이상인 파일에 대해서만 작동합니다. 변경? ~로.
Ed Morton

4
이것은 grep -E -v이후의 모든 것이 -e패턴으로 해석 되어야합니다 .
jazzpi

6
grep -v -e '^[[:space:]]*$' -e '^#' file스크립트 또는 구성 파일 (또는 주석에 해시 문자를 사용하는 모든 파일 형식)에서 비 공백 비 주석 행을 모두 제공합니다.
palswim

"이 -e옵션은 정규식 패턴 일치를 허용합니다." 그것은 매우 잘못된 것 입니다. -e( 매뉴얼This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-). 에서 )에 대한 (POSIX-) 정의입니다 . Grep은 이미 기본적으로 (기본) 정규 표현식을 기대합니다. 이 패턴의 경우 다음을 완전히 생략 할 수 있습니다 .. -egrep -v '^[[:space:]]*$' foo.txt
Yeti

73

간단하게 유지하십시오.

grep . filename.txt

1
이것은 나에게 파일의 모든 줄을 준다
phuclv

2
@ LưuVĩnhPhúc 빈 줄을 제외하고 파일의 모든 줄을 출력해야합니다.
Frej Connolly

2
이것은 Linux 기반 시스템의 파일에서는 작동하지만 Windows의 파일에서는 작동하지 않습니다. 아마도 Windows 줄 끝 문자 때문일 것입니다.

Windows 줄 끝으로 파일을 처리하는 OP의 문제를 완전히 해결하지는 못했지만이 문제를 해결하고 있지만 그 문제가 없으므로 완벽한 솔루션으로 판명되었습니다.
David Z

1
이것은 완벽한 솔루션입니다. 간단하고 리눅스에서 일했습니다.
W00f

30

사용하다:

$ dos2unix file
$ grep -v "^$" file

아니면 그냥 awk :

awk 'NF' file

dos2unix가 없으면 tr 과 같은 도구를 사용할 수 있습니다 .

tr -d '\r' < "$file" > t ; mv t "$file"

dos2unix 프로그램을 찾을 수 없습니다. Windows입니까? ask 명령도 작동하지 않습니다.
노드 닌자

물어보기? 아뇨 awk.
iconoclast

UNIX 스타일의 줄 끝으로 변환하는 것이 좋습니다. 그렇지 않으면 정규식이 예상대로 작동하지 않을 수 있습니다. 줄 끝을 변환 할 때까지 여기에 아무것도 효과가 없었습니다.
Ryan H.

16
grep -v "^[[:space:]]*$"

The -v makes it print lines that do not completely match

===Each part explained===
^             match start of line
[[:space:]]   match whitespace- spaces, tabs, carriage returns, etc.
*             previous match (whitespace) may exist from 0 to infinite times
$             match end of line

코드 실행

$ echo "
> hello
>       
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok

이것이 어떻게 / 왜 작동하는지에 대해 더 이해하려면 정규 표현식을 읽는 것이 좋습니다. http://www.regular-expressions.info/tutorial.html


2
어떻게 그리고 왜 작동합니까? 당신이 설명 할 수 있다면 당신의 대답은 훨씬 나을 것입니다. 예를 들어 정규 표현식은 문자열의 시작과 일치하고 POSIX 표준을 사용하는 하나 이상의 공백과 문자열의 끝을 일치시킵니다 (예 : grep -v를 사용하면 공백 만있는 모든 행을 제거함). 권리? 공백이 없으면 어떻게됩니까? 단순히 개행 문자입니까?
Ben

내 예제에서 볼 수 있듯이 빈 줄만 제거됩니다 (첫 번째 줄). 더 많은 정보를 추가 했으므로 도움이되기를 바랍니다. :)
Sepero

3

내가 사용하여 선호하는 egrep접근 방식이 벌금을 일 빈 줄 진정한 파일로 내 테스트에 불구하고 (비록 내 테스트에서 인용 부호 제외). 이것도 효과가있었습니다.

egrep -v "^(\r?\n)?$" filename.txt

그것을 시도했다. 빈 줄이 계속 표시됩니다. 파일이 Windows에서 만들어 졌기 때문일 수 있습니까?
노드 닌자

3

하나의 행에 여러 개의 빈 줄 시퀀스가 ​​있고 시퀀스 당 하나의 빈 줄만 원하는 경우

grep -v "unwantedThing" foo.txt | cat -s

cat -s 반복되는 빈 출력 라인을 억제합니다.

당신의 결과는

match1



match2

match1

match2

원래 출력의 3 개의 빈 줄은 하나의 빈 줄로 압축되거나 압축됩니다.


2
awk 'NF' file-with-blank-lines > file-with-no-blank-lines

2

이전 답변과 동일합니다.

grep -v -e '^$' foo.txt

여기서 grepgrep -e 의 확장 버전을 의미합니다 . '^ $'는 ^ (줄의 시작)과 $ (줄의 끝) 사이에 문자가 없음을 의미합니다. '^'및 '$'는 정규식 문자입니다.

따라서이 명령 grep -v은이 패턴과 일치하지 않는 모든 행을 인쇄합니다 (^와 $ 사이에 문자 없음).

이런 식으로 빈 빈 줄이 제거됩니다.


-e"확장 된 버전의 grep"을 의미하지는 않습니다 -E. 매뉴얼 -e은 패턴이 따르고 있다고 명시 적으로 말합니다. 패턴은 대시로 시작하지 않고 어쨌든 하나의 패턴 만 정의하므로 grep은 기본적으로 하나의 정규 표현식 패턴을 예상하므로 그대로 두어야합니다 grep -v '^$' foo.txt(확장 정규 표현식 기능 필요 없음). 또한 이것은 파일의 빈 줄을 제거하지 않고 출력을 통해 파이프되는 줄만 제거한다는 점을 언급 할 가치가 있습니다. 이 경우 sed -i올바른 도구가 될 것입니다.
Yeti

1

나는 열심히 노력했지만 이것이 효과가있는 것 같습니다 ( \r여기에서 물고 있다고 가정 ).

printf "\r" | egrep -xv "[[:space:]]*"

첫 번째 부분을 파일의 출력으로 바꾸면 작동합니다.
노드 닌자

0

펄 사용하기 :

perl -ne 'print if /\S/'

\S 공백이 아닌 문자와 일치 함을 의미합니다.


0

egrep -v "^ \ s \ s +"

egrep은 이미 정규 표현식을 수행하며 \ s는 공백입니다.

+는 현재 패턴을 복제합니다.

^는 시작입니다


0

사용하다:

grep pattern filename.txt | uniq

uniq인접한 빈 줄을 하나의 빈 줄로 줄이지 만 완전히 제거하지는 않습니다. 아직도, 나는 그런 식으로 사용하는 것을 uniq좋아합니다. 먼저 정렬하면 모든 빈 줄이 효과적으로 제거되므로 한 줄만 남기고 줄 순서를 다시 정렬하는 것은 허용되지 않을 수 있습니다.
Zach Young

좋은 지적. 이것은 또한 반복되는 줄을 mp니다. 내 솔루션에 버그가 있다고 생각합니다.
baitisj

0

흰색 선과 #부호로 시작하는 선을 제거하는 또 다른 방법이 있습니다. 구성 파일을 읽는 데 매우 유용하다고 생각합니다.

[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults    requiretty
Defaults   !visiblepw
Defaults    always_set_home
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
stack ALL=(ALL) NOPASSWD: ALL

0

그것은 사용한다는 사실 그렙 -v -e는 '^ $' 그러나 그것은 작동 할 수 그들에 1 개 이상의 공백이 빈 줄을 제거하지 않습니다 . 빈 줄을 제거하는 가장 쉽고 간단한 대답은 awk 사용이라는 것을 알았습니다 . 다음은 위의 awk 녀석들로부터 약간 수정 된 것입니다.

awk 'NF' foo.txt

그러나이 질문은 grep을 사용하기위한 것이므로 다음에 대답 할 것입니다.

grep -v '^ *$' foo.txt

참고 : ^와 * 사이의 공백.

또는 \ s를 사용하여 다음과 같이 빈 공간을 나타낼 수 있습니다.

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