두 번째 파일에서 6줄을 변경하려면 다음 sed 명령을 이와 같이 작성해야 합니까?

두 번째 파일에서 6줄을 변경하려면 다음 sed 명령을 이와 같이 작성해야 합니까?

저는 쉘 스크립팅이 필요한 연구 프로젝트를 진행 중입니다. 프로그래밍 경험은 있지만 경험은 거의 없습니다. 문제의 파일은 다음과 같습니다.

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_에서 로 변경 ) 을 할당하고 싶습니다 . 이와 같이 sed 명령을 작성해야 합니까? 이것이 이것을 달성하는 유일한 방법인지 묻는 것이 아니라 이것이 이것을 달성하는 올바른 방법 중 하나인지 묻는 것입니다.LOGS_1LOGS_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

출력이 기대에 부응하는 경우(즉, 들여쓰기가 없고 모든 값이 작은따옴표로 묶이고 항상 앞뒤에 공백 문자가 있는 경우) 다음과 같이 =약간 변경할 수 있습니다.

  • 하나의 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"를 명령줄 인수로 전달할 수도 있습니다.

관련 정보