왜 두 개 이상의 빈 줄을 하나의 빈 줄로 보낼 수 없나요? 어떤 팁이 있나요?
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