Заменить последнюю строку конфигурации, используя bash? - PullRequest
1 голос
/ 18 января 2020

У меня есть файл .env.branch со следующей структурой -

SOME_URL=https://somelink.com
SOME_OTHER_URL=https://someotherlink.com
SOME_FLAG=true
SOME_OTHER_OPTION=0
BRANCH_NAME=

Моя цель - написать сценарий bash, который заменяет конфигурацию BRANCH_NAME на основе переменной среды с именем BRANCH_NAME (количество строк в конфиге не фиксировано). Вот как я сейчас это делаю -

echo "BRANCH_NAME=/"$BRANCH_NAME >> .env.branch

, но все, что это делает, это добавляет строку каждый раз, когда я запускаю сценарий bash. Так что теперь у меня есть -

SOME_URL=https://somelink.com
SOME_OTHER_URL=https://someotherlink.com
SOME_FLAG=true
SOME_OTHER_OPTION=0
BRANCH_NAME=
BRANCH_NAME=/somebranch
BRANCH_NAME=/somebranch

Как мне добиться этого, используя sed или какую-либо другую функцию bash?

Ответы [ 4 ]

3 голосов
/ 18 января 2020

Это должно заменить вашу последнюю строку новым BRANCH_NAME и сохранить его. Просто поместите строку в скрипт bash или введите ее вручную. Оба работают.

sed -i "s/BRANCH_NAME=.*/BRANCH_NAME=${BRANCH_NAME}/" .env.branch

Результат:

> mkdir sed
> nano .env.branch
> BRANCH_NAME=some_branch
> cat .env.branch 
SOME_URL=https://somelink.com
SOME_OTHER_URL=https://someotherlink.com
SOME_FLAG=true
SOME_OTHER_OPTION=0
BRANCH_NAME=
> sed -i "s/BRANCH_NAME=.*/BRANCH_NAME=${BRANCH_NAME}/" .env.branch
> cat .env.branch 
SOME_URL=https://somelink.com
SOME_OTHER_URL=https://someotherlink.com
SOME_FLAG=true
SOME_OTHER_OPTION=0
BRANCH_NAME=some_branch
1 голос
/ 18 января 2020

С помощью sed вы можете вставить текст перед последней строкой, а затем удалить последнюю строку:

sed -e "\$iBRANCH_NAME=$BRANCH_NAME" -e '$d' inputfile

в качестве альтернативы вы можете использовать ex:

ex -s +"/^BRANCH_NAME/norm A=$BRANCH_NAME" +wq inputfile
0 голосов
/ 18 января 2020

Использование bash Speci c PE.

var=foobar

while read -r line; do
  echo "${line/BRANCH_NAME=/BRANCH_NAME=$var}"
done < file

Выход

SOME_OTHER_URL=https://someotherlink.com
SOME_FLAG=true
SOME_OTHER_OPTION=0
BRANCH_NAME=foobar

Это не редактирует файл, хотя. Просто перенаправьте в новый файл.

Для редактирования файла используйте ed.

printf '%s\n' '/^\(BRANCH_NAME=\).*/s//\1foobar/' w | ed -s file

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

var=foobar
printf '%s\n' "/^\(BRANCH_NAME=\).*/s//\1$var/" w | ed -s file
0 голосов
/ 18 января 2020

Обратите внимание, что вы можете использовать ed вместо sed и его нестандартную опцию -i:

ed .branch.env <<EOF
/^BRANCH_NAME=/c
BRANCH_NAME=/somebranch
.
wq
EOF

Заменяет первую строку, начинающуюся с BRANCH_NAME=, на нужную строку .

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