Sed/Awk/変数の変更を使用して同じ行を複数回印刷するにはどうすればよいですか?

Sed/Awk/変数の変更を使用して同じ行を複数回印刷するにはどうすればよいですか?

ㅏ。以下のように行セットがあります。

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.同じ行セットを複数回印刷し、10進文字列を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:$]}; 
}

d。一種のforループを使って印刷できますか?手でタイプする代わりに? sed、awk、または他のスクリプトコマンドを使用しますか?

答え1

努力する:

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;

    これはi1から31まで繰り返し、置換を実行した後に結果を印刷します。

  • RS=""

    これは、awkに一連の段落全体を読むように指示します。ソースコードに空白行がないため、ソースコード全体を一度に読み取る効果があります。

複数行バージョン

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

答え2

ここにある文書を使用してください。

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ではそうではありません。 )。 GNUコマンドを使用するenvsubst本質的に似ていますが、より安全なアプローチを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
    

答え3

入力ファイルの作成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

関連情報