我有一个具有以下结构的.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功能实现此目的?
这应该用新的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
使用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
这将以BRANCH_NAME=
开头的第一行替换为所需的行。
使用特定于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