[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
> > > >
> > > >
> > >
> > >
> >
> >
>
>
- Quebra de linha, Eduardo, 2009/12/14
- Re: [shell-script] Quebra de linha, miranda, 2009/12/14
- Re: [shell-script] Quebra de linha, Marcelo Andrade, 2009/12/14
- RE: [shell-script] Quebra de linha, Marcio Gil, 2009/12/14
- RE: [shell-script] Quebra de linha, Marcio Gil, 2009/12/14
- RE: [shell-script] Quebra de linha, Marcio Gil, 2009/12/14
- RE: [shell-script] Quebra de linha,
Marcio Gil <=
- Re: Quebra de linha, slackmonio, 2009/12/16
- Re: Quebra de linha, Marcio Gil, 2009/12/16
- Re: Quebra de linha, Marcio Gil, 2009/12/16
- Re: Quebra de linha, slackmonio, 2009/12/16