Буду ли я писать следующие команды sed, чтобы изменить шесть строк во втором файле?

Спасибо за редактирование.

Похоже, вы используете переменные оболочки и подстановку команд, чтобы указать имя файла и каталог, который вы хотите заархивировать.

Это сделает то, что вам нужно:

tar czfv $HOME'/Pictures_'$CREATION_TIMESTAMP'.tar.gz' "$DEST" -C Pictures

Я добавил v, чтобы сделать его подробным, чтобы вы могли видеть, что происходит. Переменная $HOME, очевидно, расширяется до вашего домашнего каталога, и я полагаю, что $CREATION _TIMESTAMP является переменной для времени. Вы заявили, что $DESTуказывает путь к каталогу, который вы пытаетесь заархивировать, поэтому он находится в конце, где он обычно находится. Я помещаю двойные кавычки вокруг $DESTна случай, если путь содержит пробелы, но если это не так, вы можете удалить их. Если $CREATION _TIMESTAMP равно тому, что у вас есть выше $(date +%F_%H%M%S), тогда в нем не будет пробелов, поэтому двойные кавычки не нужны. -Cудаляет вложенность, так что сжимается только Pictures.

1
18.05.2020, 02:58
2 ответа

Если вывод соответствует вашим ожиданиям, т. е. без отступа, все значения заключаются в одинарные кавычки и всегда ставится пробел перед а после =я бы, наверное, внес эти небольшие изменения:

  • Одна команда 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"
1
28.04.2021, 23:13

Я не думаю, что вы хотите заключать в одинарные кавычки любые замещающие переменные, кроме «LOGS _$d _number» и «photos _$d _number». Остальные переменные кажутся числами, и заключение их в одинарные кавычки, вероятно, превратит их в строки, что в лучшем случае снизит скорость ваших вычислений или (в зависимости от используемого вами языка )вызывают несоответствие типов переменных. Я предполагаю, что цель индекса '...d0' состоит в том, чтобы заставить значения быть двойными с плавающей запятой.

В зависимости от того, что именно вы делаете :Вместо того, чтобы читать переменные в качестве входных данных после запуска скрипта, вы можете просто указать их как параметры в командной строке...

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

Тогда ваш скрипт (с именем '_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" как параметр командной строки, а не как экспортируемую переменную.

0
28.04.2021, 23:13

Теги

Похожие вопросы