摘要/ 要点版本,
如果我有一组主题为[SUB]
和正文为[BODY]
的消息如下,那么如何只在存在[BODY]
时在主题后添加一个换行符(并用*
替换占位符)。
[SUB] some subject. [BODY] some body lines
with newline chars and !@@# bunch of other *#@ chars
without [(BODY)] or [(SUB)]... and more stuff
[SUB] Another subject. with no body [BODY]
[SUB] another [BODY] some body.
我希望您能将此格式化为
* some subject.
some body lines
with newline chars and !@@# bunch of other *#@ chars
without [(BODY)] or [(SUB)]... and more stuff
* Another subject. with no body
* another
some body.
我真正想做的事情是:
我正在尝试从git log
输出中自动生成我的CHANGELOG.md文件。问题在于,如果提交消息的正文部分不为空,我需要插入换行符。
当前代码如下(分成两行):
git log v0.1.0..v0.1.2 --no-merges --pretty=format:'* %s -- %cn | \
[%h](http://github.com/../../commit/%H) %n%b' | grep -v Minor | grep . >> CHANGELOG.md
并且有一个样例输出:
* Added run information display (0.1.2) -- ... | [f9b1f6c](http://github.com/../../commit/...)
+ Added runs page to show a list of all the runs and run inforation, include sorting and global filtering.
+ Updated run information display panel on the run-info page
+ Changed the links and their names around.
* Update README.md -- abc | [2a90998](http://github.com/../../commit/...)
* Update README.md -- xt | [00369bd](http://github.com/../../commit/...)
在这里,以*
开头的行是提交记录,以+
开头的行只是第一个提交记录正文的一部分。现在,它会在所有正文段落的开头添加%n
(换行符),无论是否为空。我希望仅在非空时添加此内容(可能在删除空格后)。
我该如何实现呢?我的sed
和awk
知识几乎为零,尝试学习也没有多大帮助。
(我将确保正文中的所有代码都缩进,因此不会将提交列表与正文列表混淆)
我的答案
我确信jthills的答案是正确的(甚至可能是更好的方法),但当我试图弄清楚他的意思时,我想出了这个。希望它会对我或未来的某个人有所帮助。
我粘贴了我使用的完整shell脚本:
mv CHANGELOG.md CHANGELOG.md.temp
printf '### Version '$1' \n\n' > CHANGELOG.md
git log $2..$1 --no-merges --pretty=format:'[SUB]%s -- %cn | \
[%h](http://github.com/<user>/<gitrepo>/commit/%H) [BODY]%b' | grep -v Minor | \
sed '{:q;N;s/\s*\[BODY\][\n\s]*\[SUB\]/\n\[SUB\]/;b q}' | \
sed 's/\[SUB\]/* /g' |
sed 's/\[BODY\]/\n\n/'>> CHANGELOG.md
cat CHANGELOG.md.temp >> CHANGELOG.md
rm CHANGELOG.md.temp
我基本上是使用临时文件将新的提交日志添加到CHANGELOG.md中。请随意提出这3个 sed
命令的更短版本。
+
和*
之间我需要添加一个换行符,就像这样。 - xcorat+
和*
之间已经有了一个换行符。 - Håkon Hægland