我有模板文件 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 等等。
答案 0 :(得分: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
将模板文件复制到自身上,加倍,导致每个随之而来
创建的文件是原始模板的两倍。\
中的$i\A-r.inp
是不必要的,因为A
不是特殊字符。cat
是不必要的,sed
没有-i
可以做到这一切。sed
中,s/12A/${i}/g
会将字符串“ 12 A ”替换为$i
,而不是“ A ”,除非变量包含该字母。 for
循环使用bash
ism来枚举i
...在这种情况下,有一个更简单的等效bash
ism,(见下文)。建议修订:
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 ...