sed para alterar o formato da cadeia de log do dns

0

Eu quero usar o sed para alterar o seguinte texto:

(3)www(5)first(3)nth(6)domain(3)com(0)

para:

www.first.nth.domain.com

Cada grupo entre os separadores parênteses pode ser capturado e depois reconstruído em ordem com os separadores de período, assumindo que haverá de 2 a n + 3 grupos (infinito)? Existe outro jeito?

Eu já estou familiarizado com:

s/\(\d+\)/./g

mas isso só produz:

.www.first.nth.domain.com.
    
por landen99 15.03.2016 / 20:50

2 respostas

1

Isso parece satisfazer sua exigência. Eu não tenho certeza se você está querendo usar os números entre parênteses para validar os comprimentos, mas estou assumindo que não.

echo '(3)www(5)first(3)nth(6)domain(3)com(0)' |
sed -r -e 's/^\([0-9]+\)//' -e 's/(.)\([0-9]+\)(.)/./g' -e 's/\([0-9]+\)$//'
www.first.nth.domain.com

O sed usa três REs diferentes. A primeira e a última tira as expressões (\d+) iniciais e finais limitadas. O do meio retira o restante.

    
por 15.03.2016 / 21:03
1

Que tal s/\([0-9]+\)/./g; s/^\.|\.$//g ?

Sua construção \d não será reconhecida por algumas implementações de sed. O acima é uma expressão regular estendida Posix. Qual, você sabe, deve funcionar.

O truque em sed é apenas trabalhar incrementalmente. Você conseguiu a maior parte do caminho, substituindo os dígitos entre parênteses; você simplesmente não sabia que poderia limpar o resultado com um segundo regex.

    
por 15.03.2016 / 21:34