用于更改文本文件的bash脚本

时间:2015-04-03 20:50:47

标签: bash for-loop text replace sed

我有一个名为params.dat的数据文件,我想在每次运行代码时更改文件中的值。

这是我到目前为止所得到的

i=7.0
k=0
i=0
while [ $i -lt 10]
    do
    sed "3s/.*/$j 6.9 $j/" "28s/.*/image$i.bmp/" params.dat
    ((i++))
    ((k++))
    ((j=j-0.1))
done

目标是从

更改日期文件的第3行和第28行
7.0 7.0 7.0

6.9 7.0 6.9

每次基本减去第一和第三个值

并从

更改第28行
image0.bmp

image1.bmp

所以第一次我的程序需要7.0 7.0 7.0和image0.bmp

第二次我希望它运行6.9 7.0 6.9和image1.bmp 等等...

任何人都可以给我一些如何完成它的提示吗?

提前感谢!

1 个答案:

答案 0 :(得分:0)

使用awk:

#!/bin/bash

# set iter to be the number of times to execute the script
# alternatively use $1 and pass it as parameter to the script
iter=10
for (( i=1; i<=$iter; i++ )); do
    awk 'NR==3 {print $1-0.1, $2, $3-0.1; FS="[e.]"}
         NR==28 {print $1 "e" $2+1 "." $3}
         NR!=3 && NR!=28 {print}' params.dat > .tmpfile
    mv .tmpfile params.dat
done

awk代码将到达第3行并从第一个和第三个字段中减去0.1,默认情况下由空格分隔。然后它将字段分隔符设置为“e”或句点。然后,当我们到达第28行时,该行分为三个字段:'imag' <field separator 'e'> '0' <field separator '.'> 'bmp'我们增加第二个字段并打印结果。所有其他线条都将以它们的方式打印。