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


3

我试图通过将输出重定向git shortlog到CHANGELOG.md文件以编程方式构建更改日志。

我的更改日志输出(删节):

布兰登迪尔(4):
      修复依赖冲突

我的changelog文件(空)看起来像这样:

CHANGELOG
===

我试图使用的命令是: sed "2a $(git shortlog)" ./CHANGELOG.md

但我得到这个错误: sed: -e expression #1, char 30: extra characters after command

我想要的是:

CHANGELOG
===
布兰登迪尔(4):
      修复依赖冲突

有人可以帮助连接我错过的点吗?


你试图将git shortlog第二行之后的输出放在CHANGELOG中?
Stephen Rauch,18年

对,那是正确的。我将在git历史中的几个点进行此操作,我希望(如果可能的话)总是在第二行之后插入,以便更改日志从上到下按时间顺序排列
brendandeere

Answers:


0

超级基本的东西怎么样:

#!/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

是的,这很公平。KISS原则可能是去这里的方式。
brendandeere 2017年

1

我试图运行你的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


1

当要附加/插入的文本多于一行时,除了 last 之外的每一行必须以反斜杠换行符而不是正常换行符结束:

sed "2a $(git shortlog | sed '$! s/$/\\/')" old >new

或者,对于Paulo的 '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 

谢谢,我不记得在行尾添加反斜杠。
保罗2010年

1
awk -i inplace '1;NR==2{system("git shortlog")}' CHANGELOG.md
simlev

0

我试图使用的命令是:sed“2a $(git shortlog)”./ CHANGGLOG.md

但是我得到了这个错误:sed:-e expression#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. 保持2的第一行 CHANGELOG.md
  2. 附加输出 git shortlog
  3. 忽略超出(包括)第3行的任何内容 CHANGELOG.md
  4. 将所有内容写回CHANGELOG.md(创建临时文件)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.