2

У меня есть файл, содержащий строки со встроенными макросами, такими как

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

Последовательность символов «$(n)» должна быть заменена n пробелами и символом конца строки, чтобы результирующий текст выглядел так:

int main() {
   return 0;
}

Есть ли способ сделать это с помощью некоторой утилиты bash, например, sed или awk?

1 ответ1

2

Вот Perl One-Liner, который делает эту работу:

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

Выход:

int main() {
   return 0;
}

Редактировать в соответствии с комментарием:

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

входной файл:

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

Выход:

int main() {
   return 0;
}

int main() {
   return 0;
}

Объяснение:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .