shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [shell-script] Quebra de linha


From: Marcio Gil
Subject: RE: [shell-script] Quebra de linha
Date: Tue, 15 Dec 2009 00:18:05 -0200

Sempre existe uma maneira mais prática:

$ cat temp.txt
123456
1-
asdfghj
2-
bnm,,.;
dfghjkl
3-
ertyuio

Numeração pré-posta:

$ sed -n '/^[0-9]-$/!{x;1!p};//{x;H;x;s/\n//;x};${g;p}' temp.txt
1-123456
2-asdfghj
bnm,,.;
3-dfghjkl
ertyuio

Numeração pós-posta (é só tirar um x):

$ sed -n '/^[0-9]-$/!{x;1!p};//{H;x;s/\n//;x};${g;p}' temp.txt
1234561-
asdfghj2-
bnm,,.;
dfghjkl3-
ertyuio

Explicando:

/^[0-9]-$/!{    # Se não for numeração:
x               # Troca a linha com o conteúdo espaço de troca;
1!p             # Imprime se não for a primeira linha;
}
//{             # Se for numeração (repete a busca sem o "não"):
x               # Troca a linha com o conteúdo espaço de troca;
H               # Adiciona o espaço de trabalho ao de troca;
x               # Inverte novamente;
s/\n//          # Remove o nova linha;
x               # Inverte novamente, guardando o resultado;
}
${              # No final (a última linha):
g               # Pega o espaço de troca;
p               # E o imprime.
}

Espero que seja útil.

Márcio Gil.

P.S: Pessoal, não sei se este meu estilo de ficar me respondendo
     várias vezes é incômodo para vocês, ou contra as regras.
     Acontece que eu fico com o negócio inculcado e depois tenho
     novas idéias :-), mas se for ruim eu posso me esforçar para
     não repetir isto.

> -----Original Message-----
> From: Marcio Gil
> 
> Ops! Só funcionou porque o meu exemplo só tinha numerações nas
> linhas pares :-D
> 
> Ao excluir uma das linhas não funciona:
> 
> $ cat temp.txt
> 123456
> 1-
> asdfghj
> 2-
> bnm,,.;
> dfghjkl
> 3-
> ertyuio 
> $ sed '/^[0-9]-$/!x;1d;$p;$x' temp.txt | sed 'N;s/-\n/-/'
> 1-123456
> 2-asdfghj
> bnm,,.;
> 3-
> dfghjkl
> ertyuio
> 
> Agora assim funciona:
> 
> $ sed '/^[0-9]-$/!x;1d;$p;$x' temp.txt | sed '/^[0-9]-/{N;s/\n//}'
> 1-123456
> 2-asdfghj
> bnm,,.;
> 3-dfghjkl
> ertyuio
> 
> O comando N junta a linha atual com a linha seguinte no espaço
> de trabalho, mas mantém o caracter \n. Mas como o \n agora faz
> parte da área de trabalho, podemos manipulá-lo. No entanto como
> a linha seguinte já foi juntada com a atual, na próxima
> iteração esta já não será tratada, mas a que vem depois.
> 
> Explicando o segundo SED:
> 
> /^[0-9]-/{    # Se a linha contem a numeração:
> N             # Junta com a seguinte;
> s/\n//        # E remove o \n intermediário
> }
> 
> Eduardo, não sei se eu me confundi e você realmente quer a
> numeração pós-posta, no lugar de pré-posta.
> Se for o caso agora fica fácil corrigir:
> 
> $ sed '/^[0-9]-$/!x;1d;$p;$x' temp.txt | sed
> '/^[0-9]-/{N;s/^\([0-9]-\)\n\(.*\)$/\2 \1/}'
> 123456 1-
> asdfghj 2-
> bnm,,.;
> dfghjkl 3-
> ertyuio
> 
> Um abraço.
> 
> > -----Original Message-----
> > From: Marcio Gil
> > 
> > Acho que consegui:
> > 
> > $ cat temp.txt
> > 123456
> > 1-
> > asdfghj
> > 2-
> > bnm,,.;
> > cvbnm,.
> > dfghjkl
> > 3-
> > ertyuio
> > $ sed '/^[0-9]-$/!x;1d;$p;$x' temp.txt | sed 'N;s/-\n/-/'
> > 1-123456
> > 2-asdfghj
> > bnm,,.;
> > cvbnm,.
> > 3-dfghjkl
> > ertyuio
> > $ 
> > 
> > Explicando:
> > 
> > /^[0-9]-$/!x  # Se a linha não é de numeração,
> >               # troca com o "hold space";
> > 1d            # Exclui a primeira linha,
> >               # Pois esta fica em branco;
> > $p            # Imprime a última linha;
> > $x            # E o que restou no "hold space".
> > 
> > Para juntar as linhas eu descobri este site:
> > 
> > http://thobias.org/doc/sosed.html#toc31
> > 
> > Agora só falta juntar tudo num único sed :-)
> > 
> > 
> > > -----Original Message-----
> > > From: Marcio Gil
> > > 
> > > Consegui fazer isto aqui:
> > > 
> > > $ cat temp.txt
> > > 123456
> > > 1-
> > > asdfghj
> > > 2-
> > > bnm,,.;
> > > cvbnm,.
> > > dfghjkl
> > > 3-
> > > ertyuio
> > > $ sed '/^[0-9]-$/!x;1d;$p;$x' temp.txt
> > > 1-
> > > 123456
> > > 2-
> > > asdfghj
> > > bnm,,.;
> > > cvbnm,.
> > > 3-
> > > dfghjkl
> > > ertyuio
> > > $ 
> > > 
> > > Quer dizer, pude colocar a numeração antes das linhas.
> > > 
> > > Agora só falta juntar as linhas com numeração com as linhas
> > > seguintes...  mas ainda não consegui. Alguem sabe como
> > > juntar estas linhas?
> > > 
> > > já tentei assim:
> > > 
> > > $ sed '/^[0-9]-$/!x;1d;$p;$x' temp.txt | sed 's/-\n//'
> > > 
> > > mas não funciona :-(
> > > 
> > > > -----Original Message-----
> > > > From: Eduardo
> > > > 
> > > > Senhores,
> > > > 
> > > > tenho o seguinte problema:
> > > > 
> > > > Tenho uma frase... <quebra de linha>
> > > > 1-
> > > > 
> > > > Toda vez que tiver uma frase e na linha seguinte aparecer
> > > > um número seguido de traço "-" tenho que remover a quebra
> > > > de linha e deixar tudo na mesma linha.
> > > > 
> > > > Já tentei de tudo pelo SED mas não consegui.
> > > > 
> > > > Antecipadamente obrigado.
> > > > 
> > > > -- 
> > > > ----------
> > > > 
> > > > 
> > > > Eduardo
> > > > 
> > > > 
> > > 
> > > 
> > 
> > 
> 
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]