Sed:在文件第一行后附加包含换行符的文本

Sed:在文件第一行后附加包含换行符的文本

我正在尝试通过将输出重定向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

它会:

  1. 保留前两行CHANGELOG.md
  2. 附加输出git shortlog
  3. 忽略第三行以外的内容(包括第三行)CHANGELOG.md
  4. 将所有内容写回CHANGELOG.md(创建临时文件)

请注意,您需要确保任何调用(包括第一个调用)CHANGELOG.md都有 2 行或更多行,否则此命令将不执行任何操作。

相关内容