Добро пожаловать в переполнение стека.
Мне нужно изменить все $ (\ w +) для ENV с тем же именем.Как я могу сделать это с помощью grep / sed / awk / etc?
Во-первых, grep
, sed
и awk
не являются "чистой оболочкой".Это команды, установленные в системе, как и perl
.Если вы можете установить perl
, я рекомендую его;это ужасно полезно.Если нет, то ваш следующий лучший подход - копирование исходных файлов на компьютер, на котором вы можете установить perl
, и запуск процесса как есть, так как конечным результатом является POST-результаты обратно в Confluence.(то есть, вы можете POST из вне системы).
Но, если вы действительно не можете использовать perl
, конечно, есть способ сделать это с другими инструментами обработки текста, такими как grep
sed
и awk
.
Во-вторых, что вы пробовали до сих пор?Stack Overflow работает лучше всего, когда вы показываете нам, что вы уже сделали, что работает, и как это не работает.Это помогает людям сфокусировать свои ответы в соответствии с вашей конкретной проблемой и с учетом вашего текущего понимания.
В-третьих, вот сценарий, который может вам помочь.Опять же, я не знаю, сколько bash
вы знаете, так что это может быть немного неясным.Это также, конечно, не единственный способ сделать это, и, вероятно, не самый лучший.Я настоятельно рекомендую проверить это, запустив его на нескольких образцах страниц и проверив выходные данные перед тем, как POST'ing это;инструменты типа diff
или vimdiff
очень помогут здесь.Затем, даже когда вы готовы на самом деле отправить результаты, начните медленно с подмножества и проверьте результаты, прежде чем открывать пожарный шланг.
ПРЕДУПРЕЖДЕНИЕ: приведенный ниже скрипт не работает в обычных условиях
Как отмечает @jhnc в комментариях, команда sed
завершится неудачно, если текст замены содержит символы, которые являются метасимволами замены для sed
(например, '/' в URL),Есть способ компенсировать дальнейшую логику сценария, но ИМХО по этому пути лежит безумие.
Моя рекомендация, если perl
не может быть установлена на целевой машине, - это мой "следующий лучший подход", который яупомянутое выше: скопируйте входные данные на компьютер, на котором вы можете запустить perl
и оттуда запустить преобразование и POST обратно в Confluence.
Но также посмотритена ответ от @jhnc, который предлагает решение, которое позволяет избежать этой слабости в моем.
(я помещаю это предупреждение вместо удаления своего ответа из-за более простых решений, приведенных выше, и вВ случае, если этот подход послужит основой для того, кто хочет улучшить его.)
ИСПОЛЬЗУЙТЕ НИЖЕ ПОДХОД С БОЛЬШИМ СДЕЛКОМ ОСТОРОЖНО
replace-env-params.sh
#!/bin/bash
while IFS= read -r LINE; do
MATCH=$(echo "$LINE" | grep -E '\$[a-zA-Z0-9_]+')
if [[ ! -z "$MATCH" ]]; then
ENVPARAM=$(echo "$LINE" | sed 's/^.*\$\([a-zA-Z0-9_]*\).*$/\1/')
ENVVAL="$ENVPARAM"
REPLACE="${!ENVVAL}"
LINE=$(echo "$LINE" | sed "s/\$[a-zA-Z0-9_]*/$REPLACE/")
fi
echo "$LINE"
done < $1
cat somehtml
<th class='xtr-0-0'>Version name</th>
<td class='xtr-0-1'>$RELEASE_TAG</td>
</tr>
<tr class='xtr-1'>
<th class='xtr-1-0'>Link</th>
<td class='xtr-1-1'>$RELEASE_URL</td>
тестирование ...
export RELEASE_TAG=11111111
export RELEASE_URL=22222222
./replace-env-params.sh somehtml
<th class='xtr-0-0'>Version name</th>
<td class='xtr-0-1'>11111111</td>
</tr>
<tr class='xtr-1'>
<th class='xtr-1-0'>Link</th>
<td class='xtr-1-1'>22222222</td>
Таким образом, вы можете заменить:
newPageTemplate=$(perl -p -e 's/\$(\w+)/("$ENV{$1}")/eg' < $CONFLUENCE_PAGE_TEMPLATE)
на
newPageTemplate=$(./replace-env-params.sh $CONFLUENCE_PAGE_TEMPLATE)