[linux] sed를 사용하여 빈 줄 삭제

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

sed '/^$/d'

그러나 나는 운이 없다.

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

xxxxxx


yyyyyy


zzzzzz

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

xxxxxx
yyyyyy
zzzzzz

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



답변

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

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

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

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

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


답변

awk해결책이 없습니다 .

awk 'NF' file

다음을 반환합니다.

xxxxxx
yyyyyy
zzzzzz

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


답변

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

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


답변


답변

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

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


답변

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

$ 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


답변

당신은 말할 수 있습니다 :

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