Substituir a correspondência de expressão regular por sequência contendo correspondência

2

Eu tenho um arquivo com texto como

Afghanistan=+93
Albania=+355
Algeria=+213
American Samoa=+1
Andorra=+376
Angola=+244

Ele tem toda a lista de países e seu código de discagem.

Eu quero substituir:

Afghanistan=+93 com Afghanistan(+93)=+93

Eu posso obter o padrão de seleção como =\+[0-9]* , mas qual será a sequência padrão de substituição?

Eu sei de que é a correspondência capturada para seleção, mas parece não funcionar para sed . Então o regex precisa ter seleção.

Como posso fazer isso usando sed ou qualquer outra ferramenta unix?

    
por Javanator 17.07.2015 / 09:33

4 respostas

8
sed 's/=\(+[0-9]\{1,3\}\)/()=/' 

Para resolver seu problema (como eu entendi):

Os padrões que precisam ser memorizados em sed devem estar entre parênteses - sua aparência define seu número de índice. Por exemplo:

sed 's/\(<memorized_pattern_1>\)<not_memorized>\(<memorized_pattern_2>\)//'

trocaria os padrões 1 e 2 e excluiria o do meio.

    
por 17.07.2015 / 09:39
3
sed 's/=\([^= ]*\) *$/()&/' <in >out

Os itens acima substituem apenas o último sinal de igual de uma linha e todos os caracteres que seguem primeiro com ...

  1. Uma cópia dos que seguem e que não são espaço cercados por dois parens (caso haja algum espaço à direita de uma linha)

  2. Todo o padrão correspondido novamente.

No lado direito (o campo de substituição do s/// ubstitution) representa o primeiro \( de captura agrupada \) e & representa o total correspondido padrão como um grupo. E então ...

sed 's/=\([^= ]*\) *$/()&/' <<\IN
    Afghanistan=+93
    Albania=+355
    Algeria=+213
    American Samoa=+1
    Andorra=+376
    Angola=+244
IN
    Afghanistan(+93)=+93
    Albania(+355)=+355
    Algeria(+213)=+213
    American Samoa(+1)=+1
    Andorra(+376)=+376
    Angola(+244)=+244
    
por 17.07.2015 / 10:24
3

Use isso:

sed 's/=\(+[0-9]\+\)/()=/' file

Ele procura por =+ seguido por pelo menos um dígito ( [0-9]\+ ) e substitui todos pelo formato desejado ( ()= ).

    
por 17.07.2015 / 09:40
2

Suponha que todos os dados estejam em um arquivo denominado como arquivo e, em seguida,

     awk -F "=" '{print $1"("$2")="$2}' file
    
por 17.07.2015 / 09:47