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

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

Ajuda com ER


From: Cristiano
Subject: Ajuda com ER
Date: Mon, 10 Jan 2011 12:28:15 -0000
User-agent: eGroups-EW/0.82

Salve lista, bom 2011 a todos!

Preciso de ajuda para melhorar uma ER utilizada no comando de substituição do 
sed.

Tenho uma lista com o seguinte padrão:

(...)
3-1872-1
3-1874-1
4890-1
1901-1
2-1367-1
1-1891-1
1-1892-1
3-1900-1
900-1373-1
1907-1
1908-1
900-111-1
3-1920-1
(...)

O padrão é o seguinte:

1) todos os registros terminam com '\-[0-9]', necessariamente.
2) os registros podem começar com '[0-9]*\-' **ou não**.

Preciso de uma ER, para ser usada no s do sed com um grupo, que case com os 
padrões do final e do começo, removendo-os, de modo a retornar apenas o bloco 
do meio. A lista acima deveria ficaria assim, após o processamento com o sed:


(...)
1872
1874
4890
1901
1367
1891
1892
1900
1373
1907
1908
111
1920
(...)

A ER que usei para casar o que será removido referente ao padrão do final da 
linha é a seguinte:

'\-[^-]*$'

Até aí, tudo OK. O problema é a ER para casar o padrão a ser removido no início 
da linha. Inicialmente tentei isso:

'^[^-]*\-'

Então, o comando sed ficaria:

sed 's/\(^[^-]*\-\|\-[^-]*$\)//g' lista.txt


Funciona parcialmente. Nas linha que possuem os dois padrões, no início e no 
fim, OK. Já nas linhas que **não possuem** o padrão a remover no início (apenas 
o do final), ela casa com o conteúdo que deveria retornar.

Por exemplo, as linhas:

(...)
4890-1
1901-1
(...)
1907-1
1908-1
(...)

que deveriam retornar 

(...)
4890
1901
(...)
1907
1908
(...)

retornam

(...)
1
1
(...)
1
1
(...)

pois não há o padrão do inicio da linha para casar com a primeira ER.

Então ela casa com o conteúdo que deveria retornar, pois o '-' do padrão do fim 
do arquivo faz com que a primeira ER do grupo case com o que não deve, quando 
não há o primeiro padrão.

A solução que encontrei foi executar o sed em 2 etapas, primeiro removendo o 
padrão do fim do arquivo -> sed 's/\-[^-]*$//g'.

Depois, executo o sed novamente, desta vez para remover o padrão do início do 
arquivo -> sed 's/^[^-]*\-\//g'. Como não há nenhuma linha que contenha o "-" 
para casar, caso o padrão do início do arquivo não exista, ele remove 
corretamente o que desejo, retornando a lista correta.

O problema é que eu gostaria de uma ER que fizesse isso utilizando o sed apenas 
1 vez, aproveitando os conceitos de "OU" e de grupos.

Dá para melhorar esta ER para fazer isso ou o único jeito é rodar o sed em 2 
etapas?



reply via email to

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