我正在尝试bash脚本,并希望编写一个函数,在运行某个命令时可以添加一个新的变更日志项。
给出一个变更日志,用户运行.changelog.sh
,并在## [Unreleased]
行之后将一个新的变更日志项附加到变更日志中。下面是我的代码。
new_changelog_item()
{
while read line; do
if [[ $line == "## [Unreleased]"* ]]; then
echo $line
echo "LINE FOUND IN" CHANGELOG.md
sed -i "" "s/$line/## [Unreleased]n## [$version] - $(date '+%Y-%m-%d')n### Addedn - ADD CHANGE HERE!n/g" CHANGELOG.md
return
fi
done < CHANGELOG.md
}
奇怪的是,当我在下面添加一行时,假设<!--TESTING-->
,并查找该行而不是## [Unreleased]
,如果TESTING
行之后有新行,则上面的代码相应地工作。如果我在## [Unreleased]
之后留下一条新行,它仍然不起作用。
我假设我的代码因为[]
而找不到它。如果我删除这些并添加新行,它就可以工作了。有没有一种方法可以让它找到字符串,即使它包含[]
?这将是理想的,因为我正在遵循保持更改日志格式。
实际上我在这里找到了一些帮助。
sed
替换无法正常工作,因为该行被计算为括号表达式,而不是字符串的一部分。为了解决这个问题,我最终在替换之前创建了这个变量:
newvar=$(<<<"$line" sed 's/[].*[]/\&/g')
然后,我没有在sed
语句中使用$line
,而是使用了$newvar
。代码现在工作正常。