我会像这样编写以下 sed 命令来更改第二个文件中的六行吗?

我会像这样编写以下 sed 命令来更改第二个文件中的六行吗?

我正在做一个需要 shell 脚本编写的研究项目,尽管我确实有一些编程经验,但我几乎没有经验。这是有问题的文件:

export OMP_NUM_THREADS=12


read controls
#inlist directory
export MESA_INLIST="/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist"

我借用这个文件来更改第二个文件的输入/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_将其从 更改为LOGS_1) 。LOGS_2我会像这样编写 sed 命令吗?我不是问这是否是实现这一目标的唯一方法,而是问这是否是实现这一目标的正确方法之一。

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

如果输出满足您的期望,即没有缩进,所有值都用单引号括起来,并且前后始终有一个空格字符=,我可能会进行这些细微的更改:

  • 一个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"

答案2

我认为您不希望除 'LOGS_$d_number' 和 'photos_$d_number' 之外的任何替换变量周围使用单引号。其余变量似乎是数字,并且在它们周围加上单引号可能会使它们转换成字符串,这最多会降低计算速度,或者(取决于您使用的语言)导致变量类型不匹配。我假设 '...d0' 下标的目的是强制这些值成为双浮点数。

取决于您正在做什么:您可以简单地将它们指定为命令行上的参数,而不是在脚本运行后读取变量作为输入...

the_script  4.2d1  5000 1300d0 .5d0 .001d0 3

然后你的脚本(在本例中名为“the_script”)将启动:

mass="$1"
teff="$2"
l="$3"
x="$4"
z="$5"
d_number="$6"

# Simple error checking
if [[ $# -lt 6 ]] ; then
  # print message to stderr with >&2  rather than standard output
  # $0 is the script filename
  echo "$0 : too few variables on the command line. We wanted 6 but got $#." >&2 
  exit 2
fi

您还可以将“MESA_INLIST”作为命令行参数而不是导出变量。

相关内容