Remover barra frontal usando sed

1

Eu tenho um arquivo de texto que contém o seguinte

https://git.centos.org/git/rpms/abc.git
https://git.centos.org/git/rpms/abc.git/
https://git.centos.org/git/rpms/abc

Quando eu executo o seguinte comando,

reponame=$(echo $url | awk -F/ '{print $NF}' | sed -e 's/.git\/$//' | sed -e 's/.git//')
echo $reponame

Eu devo pegar

abc

Ele falha para as linhas que terminam em .git/ , mas funciona para os outros dois casos.

    
por sudhansh_ 31.03.2016 / 12:32

4 respostas

2

Você precisa remover a barra final antes de imprimir o último campo com awk. Caso contrário, o último campo estará vazio.

Use

echo "$url" | sed -e 's#/$##' -e 's/\.git$//' | awk -F / '{print $NF}'

ou até mesmo

echo "$url" | sed -e 's#/$##' -e 's/\.git$//' -e 's#^.*/##'

Dicas:

  • Você pode fornecer vários comandos sed para uma chamada de sed. Por isso, às vezes não é necessário canalizar de sed para sed . O sed -e 'cmd1' -e 'cmd2' ... ou sed 'cmd1;cmd2;...' funcionará.
  • Você pode usar um delimitador diferente para o comando s de sed , para não ter que escapar de barras no padrão (usei # como delimitador).
por 31.03.2016 / 12:43
1

Supondo que todas as suas linhas em um arquivo tenham extensão .git

TAMBÉM A SOLUÇÃO É FORNECIDA SEM SED

SHW@SHW:/tmp/abc # cat a
https://git.centos.org/git/rpms/abc.git
https://git.centos.org/git/rpms/abc.git/
https://git.centos.org/git/rpms/abc
SHW@SHW:/tmp/abc # cat a | while read line; do basename $line .git; done
abc
abc
abc
    
por 31.03.2016 / 12:43
0

Acho que o problema é o separador de campos do comando awk . Altere a ordem, primeiro os comandos sed , do que o comando awk :

reponame=$(echo $url |  sed -e 's/.git\/$//' | sed -e 's/.git//' | awk -F/ '{print $NF}')
echo $reponame
    
por 31.03.2016 / 12:43
0
$ sed -E -e '\%(\.git|/)$%d' -e 's%.*/%%' file
abc

O script sed acima remove primeiro todas as linhas da entrada que termina com / ou a string .git . Em seguida, elimina tudo, desde as linhas restantes até o último / .

Como o texto com o qual estamos lidando contém / , estamos usando % como um delimitador alternativo nas expressões sed .

Se você quiser extrair abc de cada linha no arquivo:

$ sed -E -e 's%\.git/?$%%g' -e 's%.*/%%' file
abc
abc
abc

Isso primeiro remove a string .git (possivelmente seguida por / ) do final de cada linha de entrada antes de aplicar a mesma substituição que no primeiro comando sed .

    
por 05.06.2018 / 09:48

Tags