Busque una cadena y elimine hasta que aparezca el siguiente carácter

Cadena 1: svn+ssh://test@svn-server.com/repo-2015/branches /DEV_BRANCH_21/main/code/main_input.c

Necesita salida: main/code/main_input.c

Cadena 2: svn+ssh://test@svn-server.com/repo-2015/branches /TEST_BRANCH_56/main/code/main_output.c

Necesita salida: main/code/main_output.c

Intenté así

 echo "svn+ssh://test@svn-server.com/repo 2015/branches/DEV_BRANCH_21/main/code/main_input.c" | sed -e 's/^.*\(branches\/\)//g' 

No sé cómo proceder y eliminar hasta el próximo "/" después de las twigs.

Solutions Collecting From Web of "Busque una cadena y elimine hasta que aparezca el siguiente carácter"

 $ echo "svn+ssh://test@svn-server.com/repo 2015/branches/DEV_BRANCH_21/main/code/main_input.c" | grep -oP 'branches/.*?/\K.*' main/code/main_input.c $ echo "svn+ssh://test@svn-server.com/repo-2015/branches/TEST_BRANCH_56/main/code/main_output.c" | grep -oP 'branches/.*?/\K.*' main/code/main_output.c 
  • branches/.*?/\K significa branches coincidencia de cadenas seguidas por / y luego text hasta next / . Ver perldoc – Documentación de búsqueda para una mayor lectura

Con sed

 sed 's|.*branches/[^/]*/||' 
  • [^/]* hará coincidir text que no sea /

Usando operadores de desforre de patrón de shell POSIX:

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

Eso quitará la parte inicial más pequeña de $string que coincida con ese patrón. Es diferente de:

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

O:

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

en casos como string=foo/branches/bar/branches/baz/whatever donde el ${string#pattern} uno devolvería branches/baz/whatever mientras que los otros devolverían lo que whatever .

Yo usaría grep así:

 echo "svn+ssh://test@svn-server.com/repo 2015/branches/DEV_BRANCH_21/main/code/main_input.c" | grep -Eo "main\/code.*" 

Con sed , similar a lo que ya hiciste:

 $ 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 

Después de " branches/ ", haga coincidir cualquier número ( * ) de cualquier cosa que no sea barras inclinadas ( [^/] ), y otra barra inclinada. El grupo de captura no es necesario aquí, y cambié el delimitador en el command s a una coma para que no haya necesidad de escaping todas las barras.

Manera simple con awk sin uso de expresiones regulares:

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