Inserir caractere [RESOLVIDO]

1. Inserir caractere [RESOLVIDO]

Rafael Umbelino
tlaloc

(usa Gentoo)

Enviado em 29/12/2010 - 21:26h

Prezados,

quero contar, num texto bastante grande, quantas vezes foi usada uma expressão.
Porém, é um diálogo. Que segue mais ou menos este esquema:

Ata de 5 de Abril
Pessoa 1: blablabla
blabla
bla
Pessoa 2: bla
Pessoa 3: blabla
Ata de 6 de Abril
Pessoa 1: blablabla
blabla
bla
Pessoa 2: bla
Pessoa 3: blabla

(só para explicar a estrutura do texto)

Quero contar quantas vezes a Pessoa 1 utilizou uma dada expressão.
Pensei em fazer o seguinte:

Remover os "Atas de..."
Adicionar um caratere delimitador qualquer ao final de cada frase de cada pessoa
Fazer um grep por um padrão (a expressão que quero) dentro de cada frase que iniciar com Pessoa 1 E terminar com o caractere delimitador (por exemplo, €).

Remover os "Atas de..." é simples...
grep -v -i ^"Atas de" arquivo1 > arquivo2

Só que não estou sabendo como fazer para inserir os caracteres antes de Pessoa.
Quero um comando que insira um caractere ANTES, toda vez que encontrar a expressão Pessoa, assim:

€ Pessoa 1: blablabla
blabla
bla
€ Pessoa 2: bla
€ Pessoa 3: blabla

Depois, vou utilizar o mesmo comando para que ele insira uma nova linha depois de cada €, ficando assim:



Pessoa 1: blablabla
blabla
bla

Pessoa 2: bla

Pessoa 3: blabla

Porque assim, no final, eu consigo delimitar meu grep para frase que comecem com Pessoa e terminem com €.

Alguém pode me ajudar com o comando que não estou conseguindo saber qual utilizar?
Ah, e se houver forma mais elegante de fazer isto, seria muito bem vinda a sugestão.


  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 29/12/2010 - 21:42h

Não sei se é bem isso que quer, mas acho que o sed pode resolver:
sed -r 's/^ (Pessoa)/€ \1/g' arquivo1 > arquivo2
sed -r 's/^(€)/\1\n/g' arquivo2 > arquivo3

Espero ter ajudado.

3. Re: Inserir caractere [RESOLVIDO]

Rafael Umbelino
tlaloc

(usa Gentoo)

Enviado em 29/12/2010 - 21:45h

Pode explicar essa sintaxe?
Não sei mexer com o sed ainda.


4. Re: Inserir caractere [RESOLVIDO]

Rafael Umbelino
tlaloc

(usa Gentoo)

Enviado em 29/12/2010 - 21:49h

E o comando 1 deu o seguinte retorno/erro:

sed: -e expressão #1, caractere 18: Referência inválida \1 na segunda parte do comando `s'


5. Re: Inserir caractere [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 29/12/2010 - 22:01h

Bom, o sed trabalha com expressão regular, o primeiro comando vai procurar em todas as linhas do arquivo1 qualquer linha que começe com um espaço (^ ) e em seguida o nome da pessoa ( (Pessoa) ), e vai substituír todas essas linhas por um € mais o nome da pessoa (€ \1 (\1 = representa a expressão contida dentro de parênteses, no caso, (Pessoa) ) ). O segundo comando vai procurar todas as linhas do arquivo2 que começe por € ( ^(€) ) e vai substituír pelo mesmo caractere (\1 = €) mais o caractere "nova linha" (\n), ficando assim, um € e na linha seguinte todo o texto que estava na frente do €, no caso, Pessoa: blablabla

Acho que deu para entender, rsrs. Qualquer coisa, estude sobre expressões regulares, ou regex, como é chamado, no google tem bastante material com exemplos para facilitar o entendimento


6. Re: Inserir caractere [RESOLVIDO]

Rafael Umbelino
tlaloc

(usa Gentoo)

Enviado em 29/12/2010 - 22:09h

Quase tudo resolvido. :D

Há como especificar dois termos dentro do parenteses?
Só a cargo de curiosidade, se eu quiser fazer a mesma tarefa com com duas das pessoas da ata.



7. Re: Inserir caractere [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 29/12/2010 - 22:12h

Precisa usar o parâmetro -r, ou, use barras invertidas antes dos parênteses:
's/^ \(Pessoa\)/€ \1/g'

Ah, esqueci de mencionar; o 'g' no final significa "global", ou seja, vai substituír todas as linhas que contém a expressão procurada. Sem ela, só a primeira linha encontrada será substituída


8. Re: Inserir caractere [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 29/12/2010 - 22:20h

Sim, você pode usar dois ou quantos parênteses quiser, exemplo:
's/^ (Pessoa1) (Pessoa2) (Pessoa3)/€ \1\n€\2\n€\3/g'

arquivo original:
Pessoa1 Pessoa2 Pessoa3

depois do comando:
€ Pessoa1
€ Pessoa2
€ Pessoa3



9. Re: Inserir caractere [RESOLVIDO]

Rafael Umbelino
tlaloc

(usa Gentoo)

Enviado em 29/12/2010 - 22:20h

Funcionou perfeitinho!
Valeu!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts