$ 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