Как печатать одинаковые строки несколько раз с переменными, измененными с помощью Sed / Awk / anything?

а. У вас есть набор строк, как показано ниже.

cr_v8_sel0 : cross cp_v8_en, cp_sel0 { ignore_bins ig_v8_sel0 = binsof(cp_v8_en) && binsof(cp_sel0) intersect {[0:3],[5:$]}; } 

б. Я хотел напечатать один и тот же набор строк несколько раз с десятичной строкой, измененной с sel0 на sel31.

с. Например: Примечание: sel0 – это строки, которые были изменены на sel1 и напечатаны. И нужно от sel0 до sel31.

 cr_v8_sel0 : cross cp_v8_en, cp_sel0 { ignore_bins ig_v8_sel0 = binsof(cp_v8_en) && binsof(cp_sel0) intersect {[0:3],[5:$]}; } cr_v8_sel1 : cross cp_v8_en, cp_sel1 { ignore_bins ig_v8_sel0 = binsof(cp_v8_en) && binsof(cp_sel1) intersect {[0:3],[5:$]}; } 

д. Можем ли мы сделать это в некоторых моделях для печати, чтобы распечатать их все? а не печатать на руках? используя команду sed или awk или любую команду скрипта?

Пытаться:

 awk '{print; for (i=1;i<=31;i++) {x=$0; gsub(/sel0/, "sel" i, x); print x;}}' RS="" file 

Например, и ограничено до 3 повторений:

 $ awk '{print; for (i=1;i<=3;i++) {x=$0; gsub(/sel0/, "sel" i, x); print x;}}' RS="" file cr_v8_sel0 : cross cp_v8_en, cp_sel0 { ignore_bins ig_v8_sel0 = binsof(cp_v8_en) && binsof(cp_sel0) intersect {[0:3],[5:$]}; } cr_v8_sel1 : cross cp_v8_en, cp_sel1 { ignore_bins ig_v8_sel1 = binsof(cp_v8_en) && binsof(cp_sel1) intersect {[0:3],[5:$]}; } cr_v8_sel2 : cross cp_v8_en, cp_sel2 { ignore_bins ig_v8_sel2 = binsof(cp_v8_en) && binsof(cp_sel2) intersect {[0:3],[5:$]}; } cr_v8_sel3 : cross cp_v8_en, cp_sel3 { ignore_bins ig_v8_sel3 = binsof(cp_v8_en) && binsof(cp_sel3) intersect {[0:3],[5:$]}; } 

Как это работает

  • print

    Это печатает оригинальную версию с помощью sel0 .

  • for (i=1;i<=31;i++) {x=$0; gsub(/sel0/, "sel" i, x); print x;

    Это зацикливается на i от 1 до 31, выполняет замены и печатает результат.

  • RS=""

    Это говорит awk, чтобы читать целый абзац за раз. Поскольку у вашего источника нет пустых строк, это приводит к тому, что вы сразу просматриваете все свои источники.

Многострочная версия

 awk ' { print for (i=1;i<=31;i++) { x=$0 gsub(/sel0/, "sel" i, x) print x; } } ' RS="" file 

С этим документом:

 for i in {0..31}; do cat << EOF cr_v8_sel${i} : cross cp_v8_en, cp_sel${i} { ignore_bins ig_v8_sel${i} = binsof(cp_v8_en) && binsof(cp_sel${i}) intersect {[0:3],[5:$]}; } EOF done 

Обратите внимание, что если вы используете этот метод, вам нужно быть осторожным, что в этом документе нет ничего другого, который может быть расшифрован оболочкой (в этом случае такие вещи, как {[0:3],[5:$]} выглядят так, как будто они могут быть, но на самом деле их нет – по крайней мере, не в bash). По существу подобный (но безопасный) подход с использованием команды envsubst из GNU gettext может заменить только желаемый индекс следующим образом:

  1. создать переменную среды i для индекса

     export i 
  2. создать файл шаблона с нужным индексом, замененным переменной i

     $ cat template cr_v8_sel${i} : cross cp_v8_en, cp_sel${i} { ignore_bins ig_v8_sel${i} = binsof(cp_v8_en) && binsof(cp_sel${i}) intersect {[0:3],[5:$]}; } 
  3. цикл над значениями i заменяя только значение i

     for i in {0..31}; do envsubst '$i' < template; done 

Создайте входной файл sel.txt (ничего необычного, только то, что OP было без изменений), запустите цикл bash и используйте sed для выполнения этой работы:

 echo "cr_v8_sel0 : cross cp_v8_en, cp_sel0 { ignore_bins ig_v8_sel0 = binsof(cp_v8_en) && binsof(cp_sel0) intersect {[0:3],[5:$]}; }" > sel.txt for f in {0..31} ; do sed 's/sel0/sel'$f'/g' sel.txt ; done