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

是否使用bash替换配置的最后一行?,bash,shell,sed,Bash,Shell,Sed,我有一个结构如下的.env.branch文件- SOME_URL=https://somelink.com SOME_OTHER_URL=https://someotherlink.com SOME_FLAG=true SOME_OTHER_OPTION=0 BRANCH_NAME= 我的目标是编写一个bash脚本,根据名为BRANCH\u NAME的环境变量替换BRANCH\u NAME(配置中的行数不是固定的)。我现在就是这样做的- echo "BRANCH_NAME=/"$BRANCH_

我有一个结构如下的
.env.branch
文件-

SOME_URL=https://somelink.com
SOME_OTHER_URL=https://someotherlink.com
SOME_FLAG=true
SOME_OTHER_OPTION=0
BRANCH_NAME=
我的目标是编写一个
bash
脚本,根据名为
BRANCH\u NAME
的环境变量替换
BRANCH\u 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脚本或手动输入即可。两者都有效

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

结果:

mkdir sed >奈诺环境分部 >分支机构名称=某个分支机构 >环境分类 一些URL=https://somelink.com 一些其他URL=https://someotherlink.com 某个标志=真 某些\u其他\u选项=0 分行名称= >sed-i“s/BRANCH\u NAME=.*/BRANCH\u NAME=${BRANCH\u NAME}/”.env.BRANCH >环境分类 一些URL=https://somelink.com 一些其他URL=https://someotherlink.com 某个标志=真 某些\u其他\u选项=0 分支机构名称=某个分支机构
这应该用您拥有的任何新的
分支机构名称替换您的最后一行,并保存它。只需将该行放入bash脚本或手动输入即可。两者都有效

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

结果:

mkdir sed >奈诺环境分部 >分支机构名称=某个分支机构 >环境分类 一些URL=https://somelink.com 一些其他URL=https://someotherlink.com 某个标志=真 某些\u其他\u选项=0 分行名称= >sed-i“s/BRANCH\u NAME=.*/BRANCH\u NAME=${BRANCH\u NAME}/”.env.BRANCH >环境分类 一些URL=https://somelink.com 一些其他URL=https://someotherlink.com 某个标志=真 某些\u其他\u选项=0 分支机构名称=某个分支机构
使用sed,您可以在最后一行之前插入文本,然后删除最后一行:

sed -e "\$iBRANCH_NAME=$BRANCH_NAME" -e '$d' inputfile
或者,您可以使用
ex

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

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

sed -e "\$iBRANCH_NAME=$BRANCH_NAME" -e '$d' inputfile
或者,您可以使用
ex

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

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

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

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

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

ed.branch.env使用bash特定的PE

var=foobar

while read -r line; do
  echo "${line/BRANCH_NAME=/BRANCH_NAME=$var}"
done < file
但这不会编辑该文件。只需重定向到一个新文件

使用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

使用特定于bash的PE

var=foobar

while read -r line; do
  echo "${line/BRANCH_NAME=/BRANCH_NAME=$var}"
done < file
但这不会编辑该文件。只需重定向到一个新文件

使用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

这不管用。当I
cat.env.branch
I仍然有
branch\u NAME=
是否设置了
branch\u NAME
环境变量时,命令运行正常?因为我个人试过了,它成功了。我很高兴它成功了:)这不起作用。当I
cat.env.branch
I仍然有
branch\u NAME=
是否设置了
branch\u NAME
环境变量时,命令运行正常?因为我亲自尝试过,它很有效。我很高兴它成功了:)如果你可以替换现有的,为什么要在最后一行之前插入?这是一个没有正则表达式的替代解决方案。你完全正确,我的错。这两种方法都是值得的,这就是为什么要在最后一行之前插入,如果你可以替换已经可用的内容的话?这是一种没有正则表达式的替代解决方案。你完全正确,我的错。这两种方式都值得,这就是我注意到你在另一篇文章中在类似的上下文中使用术语
PE
,这是什么意思?参数扩展。我注意到你在另一篇文章中在类似的上下文中使用术语
PE
,这是什么意思?参数扩展。