有没有办法做多个" sed"什么时候在bash?

时间:2014-12-09 12:15:34

标签: bash sed

所以我希望在将文件用作模型模拟的输入文件之前编辑文件的多个位。目前我正在几个临时文件之间来回传递它(当我尝试写入同一个临时文件时有点错误),最后制作一个我可以用来运行模型的文件。有没有办法同时进行所有这些改动?我认为我现在这样做可能效率很低。下面的代码示例:

sed -e "s/9000000.0/${naerval}/" MC_NAMELIST_Pin14_Run3.IN > /tmp/temp1.in 
                #sed is away to change a string in a text file
sed -e "s/8000000.0/${sig_aer}/" /tmp/temp1.in > /tmp/temp2.in

sed -e "s/7000000.0/${d_aer}/" /tmp/temp2.in > /tmp/temp1.in

sed -e "s/6000000.0/${t_twall}/" /tmp/temp1.in > /tmp/temp2.in

sed -e "s/5000000.0/${RH}/" /tmp/temp2.in > /tmp/temp1.in

sed -e "s/4000000.0/${Therm_Coeff}/" /tmp/temp1.in > /tmp/temp2.in

sed -e "s/3000000.0/${press_decay}/" /tmp/temp2.in > /tmp/temp1.in

sed -e "s/2000000.0/${kappa}/" /tmp/temp1.in > /tmp/NAMELIST.IN

./main.exe /tmp/NAMELIST.IN 

我还试图用以下代码替换此代码:

sed -i.bak s~9000000.0~${naerval}~;s~8000000.0~${sig_aer}~;s~7000000.0~${d_aer}~;s~6000000.0~${t_twall}~;s~5000000.‌0~${RH}~;s~4000000.0~${Therm_Coeff}~;s~3000000.0~${press_decay}~;s~2000000.0~${ka‌​ppa}~;" MC_NAMELIST_Pin14_Run3.IN > /tmp/NAMELIST.IN

./main.exe /tmp/NAMELIST.IN 

但是,这会导致main.exe中的错误,而原始代码则不会。因此,我假设此代码不会以预期的方式改变MC_NAMELIST_Pin14_Run3.IN。

3 个答案:

答案 0 :(得分:4)

你可以组合几个这样的sed命令:

sed -i.bak "s/9000000.0/${naerval}/; s/8000000.0/${sig_aer}/" /tmp/temp1.in
  • i.bak将启用内联编辑并使用{​​{1}}扩展名
  • 保存原始文件
  • 请注意,替换字符串无法创建斜线或新行。

您可以使用这样的备用分隔符:

.bak

答案 1 :(得分:1)

  

目前我在几个临时文件之间来回传递

编写和阅读所有这些临时文件是疯狂的,这就是管道的用途!

sed -e "s/9000000.0/${naerval}/" MC_NAMELIST_Pin14_Run3.IN | \
sed -e "s/8000000.0/${sig_aer}/" | \
sed -e "s/7000000.0/${d_aer}/" | etc.

但是您可以将所有修改合并到一个sed调用中,其中包含多个脚本,每个脚本前面都有-e

sed -e "s/9000000.0/${naerval}/" -e "s/8000000.0/${sig_aer}/" -e "s/7000000.0/${d_aer}/" -e etc. etc. MC_NAMELIST_Pin14_Run3.IN > /tmp/NAMELIST.IN

或者作为包含许多命令的单个脚本,以分号分隔:

sed -e "s/9000000.0/${naerval}/;s/8000000.0/${sig_aer}/;s/7000000.0/${d_aer}/;..." MC_NAMELIST_Pin14_Run3.IN > /tmp/NAMELIST.IN

答案 2 :(得分:0)

尝试类似:

sed -i.bak -e 's/9000000.0/${naerval}/' -e 's/8000000.0/${sig_aer}/' MC_NAMELIST_Pin14_Run3.IN