如何使用 Sed/Awk/ 更改变量多次打印相同的行?

如何使用 Sed/Awk/ 更改变量多次打印相同的行?

A。具有如下所示的一组行。

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.我想多次打印同一组行,并将十进制字符串从 sel0 更改为 sel31。

C。例如: 注意: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;

    这会i从 1 循环到 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

请注意,如果您使用此方法,则需要小心,此处文档中没有任何其他内容可能会被 shell 扩展(在本例中,类似的内容{[0:3],[5:$]}看起来可能是,但实际上并非如此) - 至少不是在 bash 中)。使用envsubstGNU 命令的本质上类似(但更安全)的方法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

相关内容