Concatene várias linhas em sequências delimitadas por “caracteres especiais”

2

Digamos que eu tenha esses comandos Bash:

$ sha="$(git log --all --format=format:%H -n 1 -- .npp.json)"
$ git branch  --contains "$sha" | tr -d " *"

agora que pode registrar algo como:

master
dev
remotes/origin/foo

minha pergunta é - existe algum utilitário Bash que possa concatenar toda a saída para mim, para que eu tenha algo assim:

master:dev:remotes/origin/foo

o utilitário pode se parecer com:

$ git branch  --contains "$sha" | tr -d " *" | concat ":"

é claro que o valor final precisaria ser reproduzido, então pode parecer:

$ result="$(git branch  --contains "$sha" | tr -d " *" | concat ":")"
$ echo "$result"
    
por Alexander Mills 13.08.2018 / 00:23

2 respostas

5

Se você está perguntando como mudar

master
dev
remotes/origin/foo

para

master:dev:remotes/origin/foo

então tr '\n' : seria a maneira clássica do UNIX de fazer isso.

Quanto ao corte de uma possível nova linha final, você pode salvar a saída em uma variável primeiro via $() e a $() a removerá, ou você pode fazer a substituição, salvar o resultado em uma variável e fazer variable=${variable%:} para aparar o cólon final. (Veja link para mais opções.)

    
por 13.08.2018 / 00:34
1

Para o meu caso de uso, a divisão em caracteres de espaço em branco funcionará, pois as ramificações do git não podem conter caracteres em branco.

Então eu posso fazer isso:

git branch  --contains "$sha" | tr -d " *" | xargs

mas para uma solução genérica, ajudaria a controlar o caractere delimitador, portanto, não considero os xargs usados acima como uma boa solução genérica.

    
por 13.08.2018 / 00:34