在本地编辑多行文件,然后多次重命名 - Linux

时间:2013-06-24 20:28:43

标签: linux sed edit

我有一个带有数值的文件需要多次编辑并保存为单独的文件。

e.g。

  1. theta = 0.0 deg ---> theta = 30.0度
  2. r = 1.0 ---> r = 4.0
  3. put,molden,visual_1_0; ---> put,molden,visual_r_theta;
  4. 然后需要将文件保存为编辑值的函数,例如 n2o_r_theta.inp

    编辑时我试过

    #!/bin/bash
    
    for i in {1..6}
    do
     r = 1.0
     theta = i*15.0
     cat n2o.inp |
     sed -i.bk -Ee "s/(theta = )/\1${theta}\2/" \
         -e "s/(r = )/\1${r}\2/" \
         -e "s/(put, molden, )/\1visual_${r}_${theta};\2/" n2o_${r}_${theta}.inp
    done
    

    给我以下错误

    1. editor.scr:第5行:r:未找到命令
    2. editor.scr:第6行:theta:未找到命令
    3. sed:-e表达式#1,字符18:在`s'命令的RHS上无效的引用\ 2
    4. 最好的情况是,如果这个脚本可以在theta和r上做2次循环。我使用using sed to edit a url string in script作为主要参考。

      最终结果 - 允许我懒惰地并行化molpro脚本,因为它有多维实现

      LC_ALL=C
      
      for j in {4..4}
      do
      for i in {1..6}
      do
          r=$(echo "scale=1; $j/2.0" | bc -l)
          theta=$(echo "scale=1; $i * 15.0" | bc -l)
          sed "s/theta = 0.0/theta = $theta/;
               s/rnn = 1.0 ang/rnn = $r ang/;
               s/visual/visual_r_${r}_theta_${theta}/" < master.inp >n2o_r_${r}_theta_${theta}.inp
          molpro2010s n2o_${r}_${theta}.inp &
      done
      done
      

1 个答案:

答案 0 :(得分:3)

您可以尝试下一步:

LC_ALL=C
for i in {1..6}
do
    r=$(printf "%.1f" $i)
    theta=$(printf "%.1f" $(($i*15)) )
    sed "s/theta = 0.0/theta = $theta/;s/r = 1.0/r = $r/;s/visual_1_0/visual_r_theta/" < n2o.inp >n2o_${r}_${theta}.inp
done

分配中=之间不应有空格。 bash中的计算(仅限整数)可以使用$(( expression ))语法完成。

printf将数字格式化为具有一个小数精度的浮点数,最后'LC_ALL = C'将语言环境设置为C - 因此,printf打印小数点而不是像许多国际环境中的逗号。 (如果你有C或我们喜欢,不需要LC_ALL线。)

以上脚本从输入文件生成:

theta = 0.0 deg
r = 1.0
put, molden, visual_1_0 ;

接下来的6个文件

theta = 15.0 deg
r = 1.0
put, molden, visual_r_theta ;

theta = 30.0 deg
r = 2.0
put, molden, visual_r_theta ;

theta = 45.0 deg
r = 3.0
put, molden, visual_r_theta ;

theta = 60.0 deg
r = 4.0
put, molden, visual_r_theta ;

theta = 75.0 deg
r = 5.0
put, molden, visual_r_theta ;

theta = 90.0 deg
r = 6.0
put, molden, visual_r_theta ;

如果你想要

put, molden, visual_r_theta ;

替换为rtheta的值,使用下一个sed行:

sed "s/theta = 0.0/theta = $theta/;s/r = 1.0/r = $r/;s/visual_1_0/visual_${r}_${theta}/" < n2o.inp >n2o_${r}_${theta}.inp

将产生如下行:

put, molden, visual_4.0_60.0 ;

最后,如果需要浮点计算,则应使用bc命令,如:

theta=$(echo "scale=1; $i * 12.5" | bc -l)

依旧......