用变量替换字符串,输出到可变命名的文件

时间:2017-07-16 21:50:54

标签: bash shell sed

我有模板文件 12A-r.inp 。我想从这个文件准备文件,其名称将是 16A-r.inp 20A-r.inp 24A-r.inp 。我想根据他们的名字更改这些文件中的一些参数。例如,我想在文件 12A-r.inp 中的所有位置替换字符串“ 12A ”, 16A 20A-r.inp 中的16A-r.inp 20A 。我已经为此编写了以下代码:

for ((i=12;i<=24;i=i+4))
do
  cat 12A-r.inp >> $i\A-r.inp
done
for ((i=12;i<=24;i=i+4))
do
  sed -i "s/12A/${i}/g" $i\A-r.inp
done

但问题是 12A $ {i} 取代,而不是像 16A 20A 等等。

1 个答案:

答案 0 :(得分:1)

观察:

  1. for ((i=12;i<=24;i=i+4)) 12,16,20,24 。没有必要 从12开始,因为模板已经正确。更差, 在i=12时,此代码cat 12A-r.inp >> $i\A-r.inp 会附加 a 将模板文件复制到自身上,加倍,导致每个随之而来 创建的文件是原始模板的两倍。
  2. \中的$i\A-r.inp是不必要的,因为A不是特殊字符。
  3. cat是不必要的,sed没有-i可以做到这一切。
  4. sed中,s/12A/${i}/g会将字符串“ 12 A ”替换为$i,而不是“ A ”,除非变量包含该字母。
  5. for循环使用bash ism来枚举i ...在这种情况下,有一个更简单的等效bash ism,(见下文)。
  6. 建议修订:

    for i in {16..24..4}A
    do
      sed "s/12A/${i}/g" 12A-r.inp > ${i}-r.inp
    done
    

    工作原理:

    • $i设置为 16A,20A, 24A
    • sed重复读取模板,将 12A 替换为$i, 将所有内容打印到 STDOUT ...
    • 被重定向到适当命名的文件。