Передайте переменную команде sed

#bash #sed

Вопрос:

Я уже некоторое время работаю над этой командой sed, команда должна искать и заменять любые входные данные, подобные этому, в файле, переданном параметром в мой сценарий оболочки :

 ${GDATEF(-4D,ddMMyyyy)}
 

Он должен заменить его текущей датой минус или плюс число перед D (здесь это будет текущая дата -4 дня).

До сих пор мне удавалось делать это для определенной строки, но я не знаю, как это сделать, передав файл в качестве парметра :

*Сценарий оболочки, который работает только для одной строки :

 sed '
      s/D,ddMMyyyy)}/ days\\"  \\"%d/%m/%Y\\"/g;
      s/${GDATEF(/date -d \\"`date`   /g;
      s/date -d /date -d/g;
      s/\//ge;
      ' <<<'${GDATEF(-4D,ddMMyyyy)}'
 

Результат этого : 16/10/2021, как и ожидалось

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

Я пробовал это, но это приводит к ошибке команды unterminated, я думаю, что у меня проблема с цитированием, но я не смог ее найти.

 sed  -i "
      s/D,ddMMyyyy)}/ days\\"  \\"%d/%m/%Y\\"/g;
      s/${GDATEF(/date -d \\"`date`   /g;
      s/date -d /date -d/g;
      s/\//ge;
      " $1
 

Спасибо за помощь!

Комментарии:

1. Я пробовал использовать одинарные кавычки, есть 2 ошибки : Ошибка 1: мой файл не обновляется, он становится пустым. Однако терминал оболочки отображает содержимое файла, но с ошибкой 2 : без выполнения команды, которая должна указать дату. Вот пример : дата-d» date 0d,ddMMyyyy)} теперь, если вы выполните это, вы получите ожидаемую дату.

2. Какая команда, по его словам, не завершена? 2-го числа? Обратные косые черты вышли из-под контроля и, вероятно, означают, что вам было бы намного лучше чередовать двойные и одинарные кавычки, чем пытаться использовать одну и избегать других.

3. it throws an unterminated command error, Пожалуйста, опубликуйте дословно сообщение об ошибке. I think I have a quoting issue Так ' что не используйте " , почему вы изменили их кавычки? Проверьте свои сценарии с помощью shellcheck. И, как уже было сказано, использование e очень небезопасно и сложно, и вы потратите на это свое время. Вместо этого используйте python и закончите с ним через час.

4. Сначала сделайте команду проще. Ваш рабочий sed пример принимает только 1 фиксированный формат, так к чему все эти проблемы? Вы используете только -4 строку в строке ${GDATEF(-4D,ddMMyyyy)} . Когда я тестирую ваш sed без e опции, я получаю вызов на свидание внутри команды дата.

5. Вы не должны решать свою проблему (покажите пример входного файла!) с sed , так что следующее улучшение-это всего лишь один шаг в неправильном направлении: sed -r 's#${GDATEF(([^D] )D,ddMMyyyy)}#date -d "1 days" "%d/%m/%Y"#e' <<<'${GDATEF(-4D,ddMMyyyy)}'