Usando sed para recuperar parte de uma linha

7

Eu tenho o comando git svn assim:

git svn log --limit=1 --oneline

Ele irá produzir oneline assim:

r12345 | <anything, as it is svn comment inputted by svn-user>

Estou tentando canalizar no comando sed para obter o 12345 , no entanto, não consigo fazê-lo funcionar. Há muitos erros e o atual é parenthesis not balanced

meu último comando foi o seguinte:

git svn log --limit=1 --oneline | sed -e 's/r\(0-9) |*//'

Eu pesquisei e a documentação do sed não está clara. Não sou muito bom com o regex e minha melhor experiência é com git --grep , que é regex simplificada com boa documentação.

O ambiente é o terminal MacOSX, se importa.

EDITAR:

sed -n 's/r\(0-9*\)// funciona, mas retorna uma string vazia.

    
por Zennichimaro 18.07.2017 / 09:58

4 respostas

14

Aqui está uma solução sem regex, porque

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

(pegue com um grão de sal)

Você pode usar cut duas vezes :

git svn log --limit=1 --oneline | cut -d ' ' -f 1 | cut -c 2-

O primeiro recorte ( cut -d ' ' -f 1 ) define o espaço como delimitador de coluna e seleciona apenas a primeira coluna, portanto r12345 . O segundo corte ( cut -c 2- ) seleciona o caractere na posição 2 e após ( 2- ).

    
por 18.07.2017 / 10:41
7

Você está quase lá

sed -e 's/r\([0-9]*\) .*//'

Você precisa dizer ao sed o que deseja \([0-9]*\) e o que não deseja / r & .*/

    
por 18.07.2017 / 10:32
3

Eu sinto que sed não é a melhor ferramenta aqui, já que é para modificar a linha, mas eu vejo isso mais como um problema de extração. Para qual regex com grupos é um caminho muito razoável de ir. Por alguma razão, grep não tem como extrair grupos, o que eu acho estranho. Felizmente pcregrep faz.

pcregrep -o1 "^r([0-9]+)"

Corresponde ao padrão "r" seguido por alguns números, somente no início da linha (é o que o ^ faz - caso contrário, você possivelmente extrairia várias correspondências se a mensagem de confirmação referisse-se a outro commit). O -o1 é extrair o primeiro grupo. Exemplo:

$ echo "r12345 | <anything>" | pcregrep -o1 "^r([0-9]+)"
12345

Por que usar isso em vez de sed ? Puramente por simplicidade. Você só precisa extrair algo, então pode usar regex puro. Eu vejo isso muito mais simples do que a resposta sed .

    
por 20.07.2017 / 21:02
-1
An other alternative may be:

$ echo "r12345 | " | sed -n 's/^r\([0-9]*\) .*$//p'
12345
$_
    
por 26.07.2017 / 12:17

Tags