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

Foi útil?

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ão
  • s//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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top