Procura por uma string e apaga até a ocorrência do próximo caractere

3

Sequência 1: svn+ssh://[email protected]/repo-2015/branches/DEV_BRANCH_21/main/code/main_input.c

Precisa de saída: main/code/main_input.c

Sequência 2: svn+ssh://[email protected]/repo-2015/branches/TEST_BRANCH_56/main/code/main_output.c

Precisa de saída: main/code/main_output.c

Tentei assim

echo "svn+ssh://[email protected]/repo 2015/branches/DEV_BRANCH_21/main/code/main_input.c" | sed -e 's/^.*\(branches\/\)//g'

Não sabe como proceder e remover até o próximo "/" depois das filiais.

    
por tony 25.08.2016 / 13:37

5 respostas

4

$ echo "svn+ssh://[email protected]/repo 2015/branches/DEV_BRANCH_21/main/code/main_input.c" | grep -oP 'branches/.*?/\K.*'
main/code/main_input.c

$ echo "svn+ssh://[email protected]/repo-2015/branches/TEST_BRANCH_56/main/code/main_output.c" | grep -oP 'branches/.*?/\K.*'
main/code/main_output.c

com sed

sed 's|.*branches/[^/]*/||'
  • [^/]* corresponderá ao texto diferente de /
por 25.08.2016 / 13:56
2

Usando operadores de separação de padrões de shell POSIX:

string=svn+ssh://srv.com/repo/branches/TEST_BRANCH_56/main/code/main_output.c
output=${string#*/branches/*/}

Isso tira a menor parte inicial de $string que corresponde a esse padrão. É diferente de:

printf '%s\n' "$string" | sed '
  :1
  $!{
   N;b1
  }
  s|.*/branches/[^/]*/||'

Ou:

expr " $string" : ' .*/branches/[^/]*/\(.*\)'

em casos como string=foo/branches/bar/branches/baz/whatever , em que ${string#pattern} retornaria branches/baz/whatever , enquanto os outros retornariam apenas whatever .

    
por 25.08.2016 / 16:03
1

Eu usaria grep assim:

echo "svn+ssh://[email protected]/repo 2015/branches/DEV_BRANCH_21/main/code/main_input.c" | grep -Eo "main\/code.*"
    
por 25.08.2016 / 13:40
1

Com sed , semelhante ao que você já fez:

$ echo "svn+ssh://srv.com/repo/branches/TEST_BRANCH_56/main/code/main_output.c" | 
  sed -e 's,^.*branches/[^/]*/,,g'
main/code/main_output.c

Após " branches/ ", combine qualquer número ( * ) de qualquer coisa, exceto barras ( [^/] ) e outra barra. O grupo de captura não é necessário aqui, e eu mudei o delimitador no comando s para uma vírgula, então não há necessidade de escapar de todas as barras.

    
por 25.08.2016 / 15:28
0

Maneira simples com awk sem uso de expressões regulares:

$ awk '{print substr($0,match($0,/main/));}' input.txt                                                                   
main/code/main_input.c
main/code/main_output.c
    
por 13.12.2017 / 05:27

Tags