Backreferencing com sed

1

Eu tenho um banco de dados contendo uma lista de longs não assinados, representando um monte de endereços de memória, seguido por um deslocamento entre dois colchetes (por exemplo, Mem[offset] , 0x2322AD4[3] ) e alguns outros dados. O que estou tentando alcançar é separar o deslocamento do endereço de memória, substituindo o colchete de abertura por um único espaço e me livrar do colchete de fechamento. O procedimento que estou tomando é o seguinte:

  1. Encontre todos os dígitos que são seguidos por um colchete de abertura (isso ocorre porque meus outros dados podem conter um colchete que NÃO deve ser confundido).
  2. Substitua APENAS o colchete por um único espaço.
  3. Localize cada dígito seguido por um colchete de fechamento e SOMENTE substitua o colchete de fechamento por um único espaço.

Os colchetes podem ser facilmente manipulados com os dois comandos a seguir:

sed 's/\[/ /' #replace the opening bracket with a single space.

sed 's/\]//' #delete the closing bracket

Mas, novamente, não quero mexer com os outros dados armazenados no banco de dados.

Meu segundo palpite foi voltar a referência para lidar com o trabalho. É possível dizer a sed para encontrar cada dígito seguido por uma chave de abertura e fazer referência de volta ao dígito e adicionar um espaço logo após, resultando em algo como isto:

0x2322AD4 3]

Então eu posso ir em frente e usar o segundo comando mencionado acima para me livrar da chave de fechamento?

Se houver uma abordagem totalmente diferente para resolver o problema, por favor poste.

    
por Fadi Hanna AL-Kass 28.07.2013 / 07:15

2 respostas

1

Eu consegui descobrir. Eis a resposta para futuras visitas à pergunta:

sed -r 's/(0[Xx][A-Fa-f0-9]+)\[([0-9]+)\]/ /g'

    
por 29.07.2013 / 03:21
3

Acho que o que você está procurando é algo assim:

sed -r 's/(0[xX][[:xdigit:]]+)\[([[:digit:]]+)\]/ /g'

por exemplo:

$ sed -r 's/(0[xX][[:xdigit:]]+)\[([[:digit:]]+)\]/ /g' <<EOF
> mem+offset: 0x2322AD4[3]  0x232BEEF[12]
> unchanged: 0x22343AF word[2] 7E[word]
> EOF

mem+offset: 0x2322AD4 3  0x232BEEF 12
unchanged: 0x22343AF word[2] 7E[word]
$

Nota: sem o 0 [xX], ele teria considerado d [2] para ser substituível na segunda linha de entrada.

    
por 28.07.2013 / 07:40