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:$]}; }
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.
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:
créer une variable d'environnement i
pour l'index
export i
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:$]}; }
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