Pergunta
Preciso usar o SED para converter todas as ocorrências de ## xxx ## para $ {xxx}. X pode ser qualquer caractere alfabético ou '_'. Eu sei que preciso usar algo como:
's/##/\${/g'
Mas é claro que isso não será adequadamente, pois será convertido ## foo ## para $ {foo $ {
Algum dinâmico? - Vestir
Solução
Aqui está uma chance de uma melhor substituição regex:
's/##\([a-zA-Z_]\+\)##/${\1}/g'
Ou se você assumir exatamente três caracteres:
's/##\([a-zA-Z_]\{3\}\)##/${\1}/g'
Outras dicas
- Encapsular o alfa e '_' dentro de ' (' e ')' e depois no lado direito referenciar isso com ' 1'.
- '+' para corresponder a um ou mais alfa e '_' (caso você veja ####).
- Adicione a opção 'G' ao final para substituir todas as correspondências (que eu acho que é o que você deseja fazer neste caso).
's/##\([a-zA-Z_]\+\)##/${\1}/g'
Usa isto:
s/##\([^#]*\)##/${\1}/
BTW, não há necessidade de escapar $ no lado direito do operador "S".
sed 's/##\([a-zA-Z_][a-zA-Z_][a-zA-Z_]\)##/${\1}/'
o \(...\)
lembra ... e é referenciado como \1
na expansão. Use citações únicas para salvar sua sanidade.
Como observado nos comentários abaixo, isso também pode ser contratado para:
sed 's/##\([a-zA-Z_]\{3\}\)##/${\1}/'
Esta resposta assume que o exemplo queria exatamente três caracteres correspondidos. Existem várias variações, dependendo do que está entre as marcas de hash. A parte principal é lembrar parte da string correspondente.
echo "##foo##" | sed 's/##/${/;s//}/'
s
Alterar apenas 1 ocorrência por padrãos//
Pegue o último padrão de pesquisa usado para que o segundo s também##
e apenas a segunda ocorrência ainda existe
eco '## xxx ##' | sed "s/^## ([^#]*)/## $ { 1}/g"
sed 's/([^az^Az^0-9]*)/(&)/pg