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