sed를 사용하여 빈 줄 삭제


349

sed를 사용하여 빈 줄을 삭제하려고합니다.

sed '/^$/d'

그러나 나는 운이 없다.

예를 들어 다음 줄이 있습니다.

xxxxxx


yyyyyy


zzzzzz

나는 그것이 다음과 같이되기를 원합니다.

xxxxxx
yyyyyy
zzzzzz

이것에 대한 코드는 무엇입니까?


2
당신의 sed 명령은 괜찮아 보인다, 작동합니다
perreal

공백 / 탭이없고 CR + LF 줄 끝 이 있어도 위의 명령은 작동하지 않습니다 .
devnull

답변:


627

"빈"줄에 공백이나 탭이있을 수 있습니다. 공백 만 포함하는 모든 행을 제거 하려면 POSIX 클래스 를 사용하십시오 sed.

sed '/^[[:space:]]*$/d'

ERE를 사용하는 짧은 버전 (예 : gnu sed) :

sed -r '/^\s*$/d'

sed는 PCRE를 지원 하지 않습니다 .


3
@HuStmpHrrr gnu sed는 PCRE를 전혀 지원하지 않습니다. 그것은와 함께 ERE입니다-r
Kent

8
OS X가 필요 sed -i "" '/^[[:space:]]*$/d' <filename>,
jww

@BernieReiter ^\s*$는 모든 "빈"줄과 일치합니다. 여기서 비어 있으면 줄에 문자가 없거나 줄에 빈 문자열 (예 : 공백) 만있는 것입니다. 모든 일치하는 줄은 d명령 으로 sed에 의해 제거됩니다 .
Kent

96

awk해결책이 없습니다 .

awk 'NF' file

다음을 반환합니다.

xxxxxx
yyyyyy
zzzzzz

어떻게 작동합니까? 때문에 NF, 그 라인이 비어있는 '필드의 수 "에 대한 스탠드 그 AWK False로 0을 평가하고 더 선이 인쇄되지 않습니다 때문에, 0 fiedls이있다; 그러나 필드가 하나 이상 있으면 평가는 참이며 awk기본 조치를 수행합니다. 현재 행을 인쇄하십시오.


1
우와 심지어 AWK의 BSD의 "최소화"버전 (버전 20121220 (FreeBSD의)와 함께 실행되어 감사합니다 :-).
버니 라이터에게

@BernieReiter 당신은 환영합니다 :) 그렇습니다, 이것은 모든 awk 버전이 허용하는 매우 기본적인 관용적 인 것입니다.
fedorqui 'SO 중지 피해'

그리고 빠르고 더러운 테스트의 경우 awk를 두 번 호출 $ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -) real 0m0.006s user 0m0.000s sys 0m0.008s $ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -) real 0m0.014s user 0m0.002s sys 0m0.006s 합니다. 패턴과 같은 awk 스크립트에 이것을 포함시키는 멋진 방법을 알고 있습니까? awk '/ mypattern / {do stuff ...}'
Bernie Reiter

@BernieReiter 말할 수 있습니다 awk 'NF {do stuff...}'.
fedorqui 'SO 중지 피해'

1
또한 공백이있는 행만 무시합니다.
wisbucky

60

sed '/^$/d'파일을 수정 하시겠습니까? 그렇다면 -i플래그를 사용해야합니다 .

아마도 그 줄이 비어 있지 않을 수도 있습니다. 그렇다면이 질문 을보십시오 .txt 파일에서 빈 줄을 제거하고 줄의 시작과 끝에서 공백을 제거하십시오 .


예. 파일을 수정하고 있습니다. * .csv. -i를 sed 명령에 어떻게 배치해야합니까?
jonas

2
sed -i '/^$/d'한 가지 방법입니다.
Alberto Zaccagni

49

1
이들은 당신의 온라인 도구에 올바르게 표시하지만, []해야 하지 여기에 코드가 정확하지 않은, 그래서 브라켓 표현식에서 이스케이프 \[\[:space:\]\]또는 \[ \t\]-해야 [[:space:]]하고 [ \t].
Benjamin W.

1
@BenjaminW. 찾아 주셔서 감사합니다. 그것들은 원저자 출신이 아니라 일반 텍스트에서 "코드"로 변경되었을 때 편집 3 에서 나 왔으며 ,`\`이스케이프를 "노출"했습니다. 나는 지금 그들을 고쳤다.
wisbucky

30

나는 이것이 가장 쉽고 빠른 것이라고 믿습니다.

cat file.txt | grep .

모든 공백 줄을 무시 해야하는 경우 다음을 시도하십시오.

cat file.txt | grep '\S'

예:

s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l

출력

7
5

5
필요 없음 cat, grep파일도 가져옵니다 :grep . file.txt
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

3
예, 알고 있습니다. 그러나 초기 질문은 소스가 파일인지 아니면 다른 것인지 언급하지 않았으므로 해결책은 "|"다음에 오는 것입니다. 라인 소스와 솔루션을 구별하기 만하면됩니다.
Vadim

2
grep '\S'확실히 휴대용이 아닙니다. 그렇다면 grep -P사용할 수 grep -P '\S'있지만 모든 플랫폼에서 지원되는 것은 아닙니다.
tripleee

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

15

여기 에 허용 된 답변과 위 의 허용 된 답변의 도움으로 다음 을 사용했습니다.

$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt

`s/^ *//`  => left trim
`s/ *$//`  => right trim
`/^$/d`    => remove empty line
`/^\s*$/d` => delete lines which may contain white space

이것은 모든 기반을 다루고 내 요구에 완벽하게 작동합니다. 오리지널 포스터 @Kent and @kev


5

당신은 말할 수 있습니다 :

sed -n '/ / p' filename    #there is a space between '//'

.. 그것은 의미 print all lines except the empty one(s)와 조용함
Timo

2

"grep"을 사용하여 이와 같은 작업을 수행 할 수도 있습니다.

egrep -v "^$" file.txt


2

텍스트 파일이 Windows에서 작성되었으므로 행 끝 순서는 \r\n입니다. sed를 실행하거나 사용하기 전에 dos2unix를 사용하여 UNIX 스타일 텍스트 파일로 변환 할 수 있습니다.

sed -r "/^\r?$/d"

캐리지 리턴 여부에 관계없이 빈 줄을 제거합니다.


안녕하세요, -r깃발 은 무엇을 하고 있으며 -i파일을 직접 수정하고 화면에 인쇄하지 않도록 결합 할 수 있습니다. 또한이 명령은 다음과 같이 작동한다고 생각합니다.sed -r "/^\r$/d"
Alexander Cska

2

또 다른 옵션이없는 sed, awk, perl, 등

strings $file > $output

문자열-파일에 인쇄 가능한 문자열을 인쇄합니다.


당신은 strings대신에 의미 string합니까?
Mickael B.

@MickaelB 님 안녕하세요. 네 말이 맞아 내가 고쳐
user319660

0

bash대답은 다음과 같이 perl대체 패턴을 사용하여 전역 패턴 g플래그 와 함께 사용하는 것이 좋습니다 .

$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

이 답변은 빈 줄에 공백이 있는지 여부를 설명하고 ( [\ ]*) |여러 검색어 / 필드를 구분하는 데 사용 합니다. macOS High Sierra 및 CentOS 6/7에서 테스트되었습니다.

참고로, OP의 원래 코드 sed '/^$/d' $filebash고성능 슈퍼 컴퓨팅 클러스터에서 macOS High Sierra 및 CentOS 6/7 Linux의 터미널에서 잘 작동 합니다.


-3

sed가 있는 FreeBSD 10.1의 경우이 솔루션 만 작동했습니다.

sed -e '/^[     ]*$/d' "testfile"

내부 []에는 공백과 탭 기호가 있습니다.

테스트 파일에는 다음이 포함됩니다.

fffffff next 1 tabline ffffffffffff

ffffffff next 1 Space line ffffffffffff

ffffffff empty 1 lines ffffffffffff

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