Por que não posso sed duas [ou mais ..] linhas vazias para uma linha vazia?

5

Por que não posso sed duas [ou mais] linhas vazias para uma linha vazia? Qual é o truque?

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


hello2
    
por LanceBaynes 06.08.2011 / 11:37

3 respostas

12

O motivo pelo qual o sed falhou é que, a menos que você especifique um operador de várias linhas, ele opera no fluxo uma linha por vez. Início múltiplo da linha ^ e fim da linha $ operadores são sem sentido quando ligados juntos, se você está apenas olhando para o texto uma linha de cada vez.

A maneira mais fácil de recolher várias linhas em branco é com cat . Na página do manual:

-s, --squeeze-blank
suppress repeated empty output lines

Funciona assim:

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

world

Se você quiser remover as linhas em branco inteiramente, em vez de compactá-las, use grep :

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

Observe que, se você realmente quiser fazer isso em sed , precisará usar expressões e ações complicadas. Aqui está um exemplo (graças a fred ) que recolhe qualquer número de espaços em branco sequenciais em uma única linha em branco:

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

world

Você pode ver porque o cat -s é muito mais fácil se o recolhimento de várias linhas em branco for tudo o que você procura!

    
por 06.08.2011 / 12:41
1

Uma alternativa usando awk para a posteridade, que permite mais controle, é algo como:

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}
    }'

Isso comprime qualquer número de linhas de espaço ( length($0)==1 ) em menos, mas não necessariamente zero (3 neste caso).

Portanto, 1, 2 ou 3 linhas de espaço em branco serão preservadas, mas mais de 3 sempre serão compactadas para 3.

    
por 18.05.2017 / 00:46
0

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

    
por 18.05.2017 / 00:57

Tags