remove caracteres especiais usando sed

0

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:34

2 respostas

2

Usando grep com PCRE ( -P ):

grep -Po '.*/\K[^.]+' file.txt

A parte desejada é extraída por [^.]+ , .*/ corresponde à parte anterior a abc e \K descarta a correspondência.

Exemplo:

$ cat file.txt 
https://git.centos.org/git/rpms/abc.git
https://git.centos.org/git/rpms/abc.git/
https://git.centos.org/git/rpms/abc

$ grep -Po '.*/\K[^.]+' file.txt
abc
abc
abc

Lógica semelhante usando sed , usando o agrupamento de padrões:

$ sed -r 's#.*/([^.]+).*##' file.txt 
abc
abc
abc
    
por heemayl 31.03.2016 / 12:44
1

Eu sei que a pergunta pede por uma sed solution, no entanto, supondo que a string para extrair esteja sempre no 6º campo, como no exemplo, isso é feito mais facilmente usando AWK :

awk -F/ 'match($6, /^[^.]+/, x) {print x[0]}' file
  • -F/ : define o separador do campo de entrada como / ;
  • match($6, /^[^.]+/, x) : se o sexto campo corresponder a ^[^.]+ uma ou mais vezes, armazena as correspondências em uma matriz x an executa o seguinte bloco;
  • {print x[0]} : imprime o primeiro elemento de x .
% cat file
https://git.centos.org/git/rpms/abc.git
https://git.centos.org/git/rpms/abc.git/
https://git.centos.org/git/rpms/abc
% awk -F/ 'match($6, /^[^.]+/, x) {print x[0]}' file
abc
abc
abc
    
por kos 31.03.2016 / 13:14