我正在尝试通过将输出重定向git shortlog
到 CHANGELOG.md 文件来以编程方式构建变更日志。
我的变更日志输出如下(节选):
布伦丹·迪尔 (4): 修复依赖冲突
我的变更日志文件(空)如下所示:
变更日志 ===
我尝试使用的命令是:
sed "2a $(git shortlog)" ./CHANGELOG.md
但是我收到此错误:sed: -e expression #1, char 30: extra characters after command
我想要的是:
变更日志 === 布伦丹·迪尔 (4): 修复依赖冲突
有人能帮我把我遗漏的点连接起来吗?
答案1
比如一些非常基本的东西:
#!/usr/bin/env bash
head -n 2 CHANGELOG.md >CHANGELOG.md.tmp
git shortlog >>CHANGELOG.md.tmp
tail -n +3 CHANGELOG.tmp >> CHANGELOG.md.tmp
rm CHANGELOG.md
mv CHANGELOG.md.tmp CHANGELOG.md
答案2
我尝试运行你的 sed sed "2a $(git shortlog)" ./CHANGELOG.md
,但找不到解决方案。我希望看到解决办法 :)。
如果“git shortlog”是一个文件,则 sed 解决方案将使用命令r
来读取该文件。
sed 2r shortlog' ./CHANGELOG.md
GNU sed 解决方案可能是
sed '2 {h;s/.*/git shortlog/e;H;g}' ./CHANGELOG.md
答案3
当要附加/插入的文本超过一行时,每行除了最后一个必须以反斜杠换行符而不是普通换行符结尾:
sed "2a $(git shortlog | sed '$! s/$/\\/')" old >new
或者说,圣保罗'gsed s/whatever/cmd/e',你可以这样做:
awk '1;NR==2{system("git shortlog")}' old >new
# note: 1 is the simplest possible pattern that matches all lines;
# since no action is given the default is to print each line;
# after printing line 2 we run the command with output to same stdout
答案4
我尝试使用的命令是: sed "2a $(git shortlog)" ./CHANGELOG.md
但是我收到此错误: sed: -e 表达式 #1, char 30: 命令后有多余的字符
出现此错误的原因是,由于 shell 的扩展,实际运行的命令看起来像
sed '2a Brendan Deere (4)[...]'
这不是一个有效的sed
命令,因为换行符没有被转义。
为了实现您想要的目标,您可以使用 GNU 执行以下操作sed
:
gsed -i '2 {h;s/.*/git shortlog/e;H;g};3,$d' CHANGELOG.md
它会:
- 保留前两行
CHANGELOG.md
- 附加输出
git shortlog
- 忽略第三行以外的内容(包括第三行)
CHANGELOG.md
- 将所有内容写回
CHANGELOG.md
(创建临时文件)
请注意,您需要确保任何调用(包括第一个调用)CHANGELOG.md
都有 2 行或更多行,否则此命令将不执行任何操作。