私はシェルスクリプトを必要とする研究プロジェクトを進めています。プログラミング経験はありますが、経験はほとんどありません。問題のファイルは次のとおりです。
export OMP_NUM_THREADS=12
read controls
#inlist directory
export MESA_INLIST="/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist"
2番目のファイルの入力を変更するためにこのファイルを借りました/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist
。
RSP_mass = 4.165d0
RSP_Teff = 6050
RSP_L = 1438.8d0
RSP_X = 0.73d0
RSP_Z = 0.007d0
log_directory='LOGS_1'
photo_directory='photos_1'
これらのさまざまな変数に異なる浮動小数点(または'photos_
に関連付けられた整数と文字列、たとえばから'LOGS_
に変更)を割り当てたいと思います。このようにsedコマンドを書く必要がありますか?これがこれを達成する唯一の方法であるかどうかを尋ねるのではなく、これがこれを達成する正しい方法の1つであるかどうかを尋ねることです。LOGS_1
LOGS_2
read mass
read Teff
read L
read X
read Z
read d_number
sed -i -e "s/.*\(RSP_mass\).*/\1 = '$mass'/i" "$MESA_INLIST"
sed -i -e "s/.*\(RSP_Teff\).*/\1 = '$Teff'/i" "$MESA_INLIST"
sed -i -e "s/.*\(RSP_L\).*/\1 = '$L'/i" "$MESA_INLIST"
sed -i -e "s/.*\(RSP_X\).*/\1 = '$X'/i" "$MESA_INLIST"
sed -i -e "s/.*\(RSP_Z\).*/\1 = '$Z'/i" "$MESA_INLIST"
sed -i -e "s/.*\(log_directory\).*/\1 = 'LOGS_$d_number'/i" "$MESA_INLIST"
sed -i -e "s/.*\(photo_directory\).*/\1 = 'photos_$d_number'/i" "$MESA_INLIST"
なぜ私がsedコマンドをこの特定の方法で書いたのかについては、以下を参照してください。私の前の質問。
ベストアンサー1
出力が期待に一致する場合(つまり、インデントがなく、すべての値が一重引用符で囲まれ、常に前後にスペース文字がある場合)、次のように少し=
変更できます。
- 1つの
read
コマンド(-p
サポートされている場合)がすべての変数に適用されます。すべての値を一度に編集する方が簡単です(スペース/タブ区切り)。 - 電話
sed
が来た、もう来た以前の回答 - 行の先頭に一致するスペースまたはタブのみを
.*
使用して置換する^[[:blank:]]*
- 一貫性を保つために、ローカル変数には小文字の変数名を使用します。
read -p "Please enter mass, Teff, L, X, Z, directory number: " mass teff l x z d_number
sed -i \
-e "s/^[[:blank:]]*\(RSP_mass\).*/\1 = '$mass'/i" \
-e "s/^[[:blank:]]*\(RSP_Teff\).*/\1 = '$teff'/i" \
-e "s/^[[:blank:]]*\(RSP_L\).*/\1 = '$l'/i" \
-e "s/^[[:blank:]]*\(RSP_X\).*/\1 = '$x'/i" \
-e "s/^[[:blank:]]*\(RSP_Z\).*/\1 = '$z'/i" \
-e "s/^[[:blank:]]*\(log_directory\).*/\1 = 'LOGS_$d_number'/i" \
-e "s/^[[:blank:]]*\(photo_directory\).*/\1 = 'photos_$d_number'/i" \
"$MESA_INLIST"