Sed: Anexa texto contendo novas linhas de caracteres após a primeira linha de um arquivo

3

Eu estou tentando construir um changelog programaticamente redirecionando a saída de git shortlog para um arquivo CHANGELOG.md.

Meu changelog mostra isso (abreviado):

Brendan Deere (4):
      Fix dependency conflicts

Meu arquivo de changelog (vazio) se parece com isto:

CHANGELOG
===

O comando que estou tentando usar é: sed "2a $(git shortlog)" ./CHANGELOG.md

Mas recebo este erro: sed: -e expression #1, char 30: extra characters after command

O que eu quero é:

CHANGELOG
===
Brendan Deere (4):
      Fix dependency conflicts

Alguém pode ajudar a conectar os pontos que estou perdendo?

    
por brendandeere 19.10.2017 / 08:28

4 respostas

0

Que tal algo super básico como:

#!/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
    
por 19.10.2017 / 08:45
1

Eu tentei executar o seu sed sed "2a $(git shortlog)" ./CHANGELOG.md , mas não consegui descobrir uma solução. Eu gostaria de ver uma correção:).

Se o 'git shortlog' era um arquivo, uma solução sed seria com o comando r para ler o arquivo.

sed 2r shortlog' ./CHANGELOG.md

Uma solução de GNU sed poderia ser que

sed '2 {h;s/.*/git shortlog/e;H;g}' ./CHANGELOG.md

    
por 20.10.2017 / 00:12
1

Quando o texto a ser acrescentado / inserido é mais de uma linha, cada linha exceto a última deve terminar com barra invertida-nova linha em vez da nova linha normal:

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

Alternativamente, como uma variação do Paulo 'gsed s / whatever / cmd / e', você poderia fazer:

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 
    
por 20.10.2017 / 02:26
0

The command I am trying to use is: sed "2a $(git shortlog)" ./CHANGELOG.md

But I get this error: sed: -e expression #1, char 30: extra characters after command

Você recebe este erro porque o comando que está sendo executado, devido à expansão pelo shell, parece

sed '2a Brendan Deere (4)[...]'

que não é um comando sed válido, pois as novas linhas não são ignoradas.

Para conseguir o que você quer, você pode fazer o seguinte com o GNU sed :

gsed -i '2 {h;s/.*/git shortlog/e;H;g};3,$d' CHANGELOG.md

Irá:

  1. Mantenha as duas primeiras linhas de CHANGELOG.md
  2. Anexar a saída de git shortlog
  3. Ignore qualquer coisa além (e inclusive) da terceira linha de CHANGELOG.md
  4. Escreva tudo de volta em CHANGELOG.md (criando um arquivo temporário arquivo)

Note que você precisa ter certeza de que, em qualquer chamada, incluindo a primeira, CHANGELOG.md tem 2 ou mais linhas, caso contrário, este comando não fará nada.

    
por 20.10.2017 / 04:36