#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)}'