Extração de partes da string separada por espaço em branco

1

Eu tenho vários repositórios Git contendo um arquivo mergedriver.info

Esse arquivo é sempre assim:

<project name>
<repository name>

Um script, acionado por um driver de mesclagem do Git, está avaliando este arquivo:

mergedriverinfo="$(git cat-file -p HEAD:mergedriver.info)"
success=$?
if [[ "$success" == "0" ]]; then
    log "Evaluating mergedriver.info"

    PROJECT_KEY="$(sed -E 's/([^\s]+)\s+([^\s]+)//' <<< $mergedriverinfo)"
    REPO_SLUG="$(sed -E 's/([^\s]+)\s+([^\s]+)//' <<< $mergedriverinfo)"

    log "PROJECT_KEY=$PROJECT_KEY"
    log "REPO_SLUG=$REPO_SLUG"
else
    log "Unable to read mergedriver.info"
    exit 1
fi

Eu não entendo o comportamento do sed neste caso.

Para este mergedriver.info :

test
conflict-on-auto-merge

A saída de log é assim:

2017-07-20 11:05:51.747 PROJECT_KEY=test
2017-07-20 11:05:51.748 REPO_SLUG=tesconflict-on-auto-merge

Primeiro, tentei ler o mergedriver.info com sed -n 1p/2p e head / tail -1 , mas infelizmente a saída de $(git cat-file -p HEAD:mergedriver.info) é diferente para duas plataformas diferentes nas quais esse script está sendo executado:

Plataforma 1:

$ od -c <<< $(git cat-file -p HEAD:mergedriver.info)
0000000   t   e   s   t  \n   c   o   n   f   l   i   c   t   -   o   n
0000020   -   a   u   t   o   -   m   e   r   g   e  \n
0000034

Plataforma 2:

±  od -c <<< $(git cat-file -p HEAD:mergedriver.info)
0000000   t   e   s   t       c   o   n   f   l   i   c   t   -   o   n
0000020   -   a   u   t   o   -   m   e   r   g   e  \n
0000034

Como resolver este problema?

    
por BlackEye 20.07.2017 / 11:28

1 resposta

2

Você precisa perceber que o sed regex [^\s] não fará o que você acha que deveria, viz. procure por um espaço não-whitepspace, em vez disso, ele deve negar dois caracteres, uma barra invertida \ e a letra s .

O que é necessário é o \S , que é feito especificamente para isso.

E para gerenciar a saída do comando mergerdriver.info, derramando várias linhas, está o comando N da caixa de ferramentas sed .

PROJECT_KEY=$(sed -nEe '$!N;s/(\S+)\s+(\S+)//p' <<<"$mergedriverinfo")
  REPO_SLUG=$(sed -nEe '$!N;s/(\S+)\s+(\S+)//p' <<<"$mergedriverinfo")
    
por 20.07.2017 / 12:03