$ 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')
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')"
$ 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')
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.
Tags text-processing