Processamento de texto: transformando números em número equivalente de espaços no bash

2

Eu tenho um arquivo contendo strings com macros incorporadas como

int main() { $(3) return 0; $(0) }

A sequência de caracteres "$ (n)" deve ser substituída por n espaços em branco e o caractere de fim de linha, para que o texto resultante seja assim:

int main() {
   return 0;
}

Existe uma maneira de fazer isso usando algum utilitário bash, por exemplo, sed ou awk?

    
por Fabio 23.01.2018 / 11:57

1 resposta

2

Aqui está um perl one-liner que faz o trabalho:

perl -ne 's/\s*\$\((\d+)\)\s*/"\n"." "x${1}/eg;print' file.txt

Saída:

int main() {
   return 0;
}

Edite de acordo com o comentário:

perl -ne 's/\s*\$\((\d+)\)\h*(\R)?/"\n"." "x$1.$2/eg;print' file.txt

arquivo de entrada:

int main() { $(3) return 0; $(0) } $(0)
int main() { $(3) return 0; $(0) } $(0)

Saída:

int main() {
   return 0;
}

int main() {
   return 0;
}

Explicação:

s/          : substitute
  \s*       : 0 or more spaces
  \$\(      : literally $(
    (\d+)   : group 1, 1 or more digits
  \)        : literally )
  \h*       : 0 or more horizontal spaces
  (\R)?     : group 2, optional, any kind of linebreak
/
  "\n"      : a linebreak
  .         : concatenate with
  " "x$1    : a space that occurs $1 times, $1 is the content of group 1 (ie. the number inside parenthesis)
  .         : concatenate with
  $2        : group 2, linebreak if it exists
/eg         : flag execute & global
    
por 23.01.2018 / 12:42

Tags