Unix / Linux - Substitua as palavras entre parênteses

0

Eu quero substituir palavras entre parênteses em unix / Linux- como um exemplo abaixo. Estou tentando automatizar isso para facilitar meu trabalho com apenas um código incluído.

Eu tenho a string abaixo no meu script ksh

   echo "Export file to below names (ABC, DEF, GHI)"

Eu gostaria de estar como abaixo

   echo "Export file to below names ('ABC', 'DEF', 'GHI')"
    
por nehal 25.08.2016 / 15:49

2 respostas

1

$ echo "Export file to below names (ABC, DEF, GHI)" | sed -e "s/\([A-Z][A-Z][A-Z]\)/''/g"
Export file to below names ('ABC', 'DEF', 'GHI')
    
por 25.08.2016 / 16:03
1

Em Perl, quase de forma legível:

echo "Export file to below names (ABC, DEF, GHI)" |  
  perl -lne '@a = /(.*\()(.*)(\).*)/; $a[1] =~ s/\w+/\x27$&\x27/g; print @a'

A primeira correspondência divide a linha em três partes e captura todas: qualquer coisa até o parêntese à esquerda ( (.*\() ), qualquer coisa ( (.*) ) e um parêntese à direita mais qualquer coisa ( (\).*) ). Nós os colocamos no array @a e executamos uma substituição no segundo elemento (contando a partir de zero). A substituição   s/\w+/\x27$&\x27/g corresponde a cadeias de "caracteres de palavra" ( \w+ ) e substitui pela parte correspondente (de $& ) entre aspas simples. As citações são escapadas em hexadecimal para evitar uma citação-dança irritante com a concha.

Claro que com o Perl você também pode fazer coisas ilegíveis, como uma substituição no estilo sed dentro de outra substituição:

echo "Export file to below names (ABC, DEF, GHI)" |
  perl -pe 's,\(.*\), $_ = $&; s/\w+/\x27$&\x27/g; $_ ,e; ' 
Export file to below names ('ABC', 'DEF', 'GHI')

Aqui, o% final e faz a substituição externa interpretar a substituição como um trecho de código Perl, que pega a parte correspondente de $& e a edita como acima. Eu usei $_ como uma variável temporária aqui, pois $& é somente leitura. A substituição recortada pode ser movida para uma função, o que talvez torne a linha mais legível.

    
por 25.08.2016 / 16:39