英文:
How to alter a variable with a shell script using sed
问题
我正在尝试修改一个我正在运行的模型的.dat文件中的值。问题在于不能简单地使用sed -i 's/old_text/new_text/'来更改代码。
我正在尝试更改的.dat文件如下:
0.000E-00 !Argon
7.956E-03 !Methane
0.000E-00 !Ethane
1.945E-03 !Carbon Dioxide
9.901E-01 !Nitrogen
1.000E-40 !Oxygen
0.000E-00 !Hydrogen
0.000E-00 !Nitrogen Dioxide
22 !Tropopause layer
我正在尝试更改甲烷(Methane)、氮气(Nitrogen)和二氧化碳(Carbon Dioxide)的值,但我不能简单地告诉它替换'7.965E-03 !Methane',因为在我第一次运行shell脚本后,该值将发生变化。
我已经尝试将!Methane替换为$'变量名称' !Methane,但这并不能解决删除数字的问题,并且在我编译脚本后的第一次运行后也无法正常工作。
当前的脚本如下:
#file=atmos-master-copy1/CLIMA/IO/mixing_ratios.dat
#sed -i 's/Methane.*/'$muCH4_1' !Methane/' $file
但我不知道如何使它从文件开头开始更改内容。
英文:
I am attempting to alter the values in a .dat file for a model I am running. The issue is that the code cannot simply be changed with the sed -i 's/old_text/new_text/'
The .dat file I am attempting to change looks like
0.000E-00 !Argon
7.956E-03 !Methane
0.000E-00 !Ethane
1.945E-03 !Carbon Dioxide
9.901E-01 !Nitrogen
1.000E-40 !Oxygen
0.000E-00 !Hydrogen
0.000E-00 !Nitrogen Dioxide
22 !Tropopause layer
I am attempting to alter the values for methane, nitrogen, and carbon dioxide, however I cannot simply tell it to replace '7.965E-03 !Methane' because after the first time I run the shell script, that value will change.
I have attempted to replace !Methane with $'variable name' !Methane, but that does not solve the issue of removing the number, nor will it work after the first time I compile the script.
The current script is
#file=atmos-master-copy1/CLIMA/IO/mixing_ratios.dat
#sed -i 's/Methane.*/'$muCH4_1' !Methane/' $file
But I dont know how to make it start by altering the contents at the beginning of the file.
答案1
得分: 2
如果您想用变量$muCH4_1
中的值替换!Methane
的值,那么:
sed -Ei 's/^\S+\s+(!Methane)/'"$muCH4_1"'/' "$file"
^
- 行的开头锚点\S+
- 一个或多个非空白字符\s+
- 一个或多个空白字符(!Methane)
- 捕获!Methane
到捕获组1$
- 行的结尾锚点
替换为
'"$muCH4_1"'
- 变量muCH4_1
中的值\1
- 来自捕获组1的!Methane
注意:为了使第二列与原始文件中的格式保持一致,muCH4_1
必须在右侧填充空格。如果这是您想要的效果,您可以使用printf
来进行填充:
sed -Ei 's/^\S+\s+(!Methane)/'"$(printf "%-18s" "$muCH4_1")"'/' "$file"
英文:
If you want to replace the value for !Methane
with the value held by the variable $muCH4_1
, then:
sed -Ei 's/^\S+\s+(!Methane)$/'"$muCH4_1"' /' "$file"
^
- Start of line anchor\S+
- One or more non-whitespace characters\s+
- One or more whitespace characters(!Methane)
- Capture!Methane
into capture group 1$
- End of line anchor
Substitute with
'"$muCH4_1"'
- The value held by the variablemuCH4_1
\1
-!Methane
from capture group 1
Note: For the second column to line up just like in the original file, muCH4_1
must be padded with spaces to the right. If that's what you want, you can use printf
to do the padding:
sed -Ei 's/^\S+\s+(!Methane)$/'"$(printf "%-18s" "$muCH4_1")"' /' "$file"
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论