所以我希望在将文件用作模型模拟的输入文件之前编辑文件的多个位。目前我正在几个临时文件之间来回传递它(当我尝试写入同一个临时文件时有点错误),最后制作一个我可以用来运行模型的文件。有没有办法同时进行所有这些改动?我认为我现在这样做可能效率很低。下面的代码示例:
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~${kappa}~;" MC_NAMELIST_Pin14_Run3.IN > /tmp/NAMELIST.IN
./main.exe /tmp/NAMELIST.IN
但是,这会导致main.exe中的错误,而原始代码则不会。因此,我假设此代码不会以预期的方式改变MC_NAMELIST_Pin14_Run3.IN。
答案 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