使用bash替换配置的最后一行?

问题描述 投票:1回答:4

我有一个具有以下结构的.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功能实现此目的?

bash shell sed
4个回答
4
投票

这应该用新的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

2
投票

使用sed,您可以在最后一行之前插入文本,然后删除最后一行:

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

或者您可以使用ex

ex -s +"/^BRANCH_NAME/norm A=$BRANCH_NAME" +wq inputfile

0
投票

请注意,您可以使用ed,而不是sed及其非标准的-i选项:

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

这将以BRANCH_NAME=开头的第一行替换为所需的行。


0
投票

使用特定于bash的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
© www.soinside.com 2019 - 2024. All rights reserved.