Comment imprimer les mêmes lignes plusieurs fois avec des variables modifiées en utilisant Sed / Awk / n'importe quoi?

une. Avoir un set de lignes comme indiqué ci-dessous.

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:$]}; } 

b. Je voulais imprimer le même set de lignes plusieurs fois avec la string décimale ~ changé de sel0 à sel31.

c. Par exemple: Note: sel0 est la ligne est changée en sel1 et imprimée. Et besoin de sel0 jusqu'à 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:$]}; } 

ré. Pouvons-nous le faire dans une boucle pour les imprimer tous? plutôt que de taper dans les mains? en utilisant sed ou awk ou n'importe quelle command de script?

Essayer:

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

Par exemple, et limité à 3 répétitions:

 $ 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:$]}; } 

Comment ça marche

  • print

    Cela sel0 version originale avec sel0 .

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

    Cela boucle sur i de 1 à 31, effectue les substitutions et imprime le résultat.

  • RS=""

    Cela dit awk de lire un paragraphe entier à la fois. Puisque votre source n'a pas de lignes vides, cela a pour effet de lire toutes vos sources à la fois.

Version multiligne

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

Avec un document ici:

 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 

Notez que si vous utilisez cette méthode, vous devez veiller à ce qu'il n'y ait rien d'autre dans le document ici qui pourrait être développé par le shell (dans ce cas, des choses comme {[0:3],[5:$]} semblent être, mais en fait ne sont pas – du less pas dans bash). Une approche essentiellement similaire (mais plus sûre) utilisant la command envsubst de GNU gettext ne peut replace que l'index souhaité, comme suit:

  1. créer une variable d'environnement i pour l'index

     export i 
  2. créer un file model avec l'index désiré remplacé par la variable 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. boucle sur les valeurs de i substituant seulement la valeur de i

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

Faire un file d'input sel.txt , (rien de fantaisiste, seulement ce que l'OP avait sans changement), exécuter une boucle bash et utiliser sed pour faire le travail:

 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