답변:
다음을 시도하십시오 :
grep -v -e '^$' foo.txt
이 -e
옵션은 정규식 패턴 일치를 허용합니다.
작은 따옴표 ^$
는 Cshell에서 작동합니다. 다른 쉘은 작은 따옴표 나 큰 따옴표로 만족합니다.
업데이트 : 이것은 빈 줄이나 "모든 공백"(예 : "\ r \ n"스타일 줄 끝이있는 Windows 줄)이있는 파일의 경우 위와 같이 빈 줄과 유닉스 스타일 줄 끝이있는 파일 만 제거합니다.
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
이후의 모든 것이 -e
패턴으로 해석 되어야합니다 .
grep -v -e '^[[:space:]]*$' -e '^#' file
스크립트 또는 구성 파일 (또는 주석에 해시 문자를 사용하는 모든 파일 형식)에서 비 공백 비 주석 행을 모두 제공합니다.
간단하게 유지하십시오.
grep . filename.txt
사용하다:
$ dos2unix file
$ grep -v "^$" file
아니면 그냥 awk :
awk 'NF' file
dos2unix가 없으면 tr 과 같은 도구를 사용할 수 있습니다 .
tr -d '\r' < "$file" > t ; mv t "$file"
awk
.
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
이전 답변과 동일합니다.
grep -v -e '^$' foo.txt
여기서 grepgrep -e
의 확장 버전을 의미합니다 . '^ $'는 ^ (줄의 시작)과 $ (줄의 끝) 사이에 문자가 없음을 의미합니다. '^'및 '$'는 정규식 문자입니다.
따라서이 명령 grep -v
은이 패턴과 일치하지 않는 모든 행을 인쇄합니다 (^와 $ 사이에 문자 없음).
이런 식으로 빈 빈 줄이 제거됩니다.
-e
"확장 된 버전의 grep"을 의미하지는 않습니다 -E
. 매뉴얼 -e
은 패턴이 따르고 있다고 명시 적으로 말합니다. 패턴은 대시로 시작하지 않고 어쨌든 하나의 패턴 만 정의하므로 grep은 기본적으로 하나의 정규 표현식 패턴을 예상하므로 그대로 두어야합니다 grep -v '^$' foo.txt
(확장 정규 표현식 기능 필요 없음). 또한 이것은 파일의 빈 줄을 제거하지 않고 출력을 통해 파이프되는 줄만 제거한다는 점을 언급 할 가치가 있습니다. 이 경우 sed -i
올바른 도구가 될 것입니다.
사용하다:
grep pattern filename.txt | uniq
uniq
인접한 빈 줄을 하나의 빈 줄로 줄이지 만 완전히 제거하지는 않습니다. 아직도, 나는 그런 식으로 사용하는 것을 uniq
좋아합니다. 먼저 정렬하면 모든 빈 줄이 효과적으로 제거되므로 한 줄만 남기고 줄 순서를 다시 정렬하는 것은 허용되지 않을 수 있습니다.
흰색 선과 #
부호로 시작하는 선을 제거하는 또 다른 방법이 있습니다. 구성 파일을 읽는 데 매우 유용하다고 생각합니다.
[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
그것은 사용한다는 사실 그렙 -v -e는 '^ $' 그러나 그것은 작동 할 수 그들에 1 개 이상의 공백이 빈 줄을 제거하지 않습니다 . 빈 줄을 제거하는 가장 쉽고 간단한 대답은 awk 사용이라는 것을 알았습니다 . 다음은 위의 awk 녀석들로부터 약간 수정 된 것입니다.
awk 'NF' foo.txt
그러나이 질문은 grep을 사용하기위한 것이므로 다음에 대답 할 것입니다.
grep -v '^ *$' foo.txt
참고 : ^와 * 사이의 공백.
또는 \ s를 사용하여 다음과 같이 빈 공간을 나타낼 수 있습니다.
grep -v '^\s*$' foo.txt