왜 두 개 이상의 빈 줄을 하나의 빈 줄로 보낼 수 없나요?

왜 두 개 이상의 빈 줄을 하나의 빈 줄로 보낼 수 없나요?

왜 두 개 이상의 빈 줄을 하나의 빈 줄로 보낼 수 없나요? 어떤 팁이 있나요?

echo -e "hello\n\n\nhello2" | sed 's/^$\n^$/\n/g'
hello


hello2

답변1

이것이 실패하는 이유는 sed여러 줄 연산자를 지정하지 않는 한 스트림에서 한 번에 한 줄만 실행할 수 있기 때문입니다. 한 번에 한 줄의 텍스트만 보는 경우 여러 개의 줄 시작 ^및 줄 끝 연산자를 이와 같이 묶는 것은 의미가 없습니다.$

여러 개의 빈 줄을 축소하는 가장 쉬운 방법은 cat맨 페이지에서 다음을 사용하는 것입니다.

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

작동 방식은 다음과 같습니다.

$ echo -e "hello\n\n\nworld" | cat -s
hello

world

빈 줄을 압축하는 대신 완전히 제거하려면 다음을 사용하세요 grep.

$ echo -e "hello\n\n\nworld" | grep -v '^$'
hello
world

정말로 이 작업을 수행하려면 sed복잡한 표현식과 연산을 사용해야 합니다. 예를 들어보겠습니다(감사합니다.프레드)는 연속된 공백을 원하는 수만큼 하나의 빈 줄로 축소합니다.

$ echo -e "hello\n\n\nworld" | sed -re '$!N;/^\n$/!P;D'
hello

world

cat -s여러 개의 빈 줄을 축소하면 왜 훨씬 쉬운지 알 수 있습니다 !

답변2

awk더 많은 제어권을 제공하는 하위 항목에 대한 또 다른 방법은 다음과 같습니다.

cat file | awk 'BEGIN {sp=0} \
         {if (length($0)==1) {sp=sp+1} \
          if (sp>=1&&length($0)==1) {
          } else {
             for (i=1;i<=((3<sp)?3:sp);i++) {print ""}
             print $0; sp=0}
    }'

이렇게 하면 공백 줄 수( length($0)==1)를 더 적게 압축할 수 있지만 반드시 0일 필요는 없습니다(이 경우 3줄).

따라서 1줄, 2줄, 3줄의 공백은 유지되지만, 3줄 이상의 공백은 항상 3줄로 압축됩니다.

답변3

sed -e '/./b' -e :n -e 'N;s/\n$//;tn' infile

관련 정보