Procura e substitui uma sequência dentro de parênteses

0

Eu tenho um arquivo no qual há uma linha

byte address[] = { 0x54, 0x36, 0x45 };

Estou tentando alterar o arquivo por 3 parâmetros de linha de comando fornecidos pelo usuário -

grep byte | sed 's/\{.*\}/{ 0x$1, 0x$2, 0x$3 }/g' file.c

mas sem sucesso.

O comando usado é -

sh script.sh 44 33 22

O / P -

byte address[] = { 0x44, 0x33, 0x22 };

Qualquer ajuda usando sed/awk será ótima!

    
por Ashish K 05.06.2017 / 20:45

1 resposta

2

Você precisa entender que \{ é especial em sed . Então você precisa disso:

#!/bin/sh
# filename: yourscript.sh
# usage: ./yourscript.sh 44 33 22
for arg; do set "$@" " 0x$arg"; shift; done
IFS=",";
sed -e "/byte address\[\]/s/{[^}]*}/{$* }/"  yourfile.c

Resultado

When invoked as:
%   ./yourscript.sh 44 33 22
byte address[] = { 0x44, 0x33, 0x22 };

Explicação

  1. A primeira tarefa é obter os números hexified dos argumentos. Isso é obtido através de loop na lista de argumentos usando o loop for . Cada vez, adicionamos a versão hexa do argumento atual no final da lista de argumentos $@ enquanto, ao mesmo tempo, tiramos o argumento atual shift da frente da lista. Isso significa que, no final das iterações do loop for , acabaríamos com a lista de argumentos hexified .
  2. Agora, definimos o IFS como uma vírgula para unir os argumentos com uma vírgula.
  3. O código sed traz a lista "$*" dentro da parte de substituição sed s/// .
por 05.06.2017 / 21:31