2012-03-25 15 views
11

Estoy tratando de eliminar subcadena de la variable usando sed como esto:Extracción subcadena de cadena usando sed

PRINT_THIS="`echo "$fullpath" | sed 's/${rootpath}//' -`" 

donde

fullpath="/media/some path/dir/helloworld/src" 
rootpath=/media/some path/dir 

Quiero hacer eco solo resto de la ruta completa como esto (Estoy usando esto en un montón de directorios, así que tengo que almacenarlo en variables y hacerlo automáticamente

echo "helloworld/src" 

usi variables ng sería

echo "Directory: $PRINT_THIS" 

El problema es que no puedo conseguir sed para eliminar la subcadena, lo que estoy haciendo mal? Gracias

Respuesta

25

No es necesario sed para eso, bash sí sola es suficiente:

$ fullpath="/media/some path/dir/helloworld/src" 
$ rootpath="/media/some path/dir" 
$ echo ${fullpath#${rootpath}} 
/helloworld/src 
$ echo ${fullpath#${rootpath}/} 
helloworld/src 
$ rootpath=unrelated 
$ echo ${fullpath#${rootpath}/} 
/media/some path/dir/helloworld/src 

Mira la documentación String manipulation.

+0

Gracias, es gracioso porque utilicé la manipulación de cadenas en otra parte del script, pero lo olvidé – rluks

+1

Si no sabes si $ rootpath finaliza con una barra inclinada, puedes hacer: 'shopt -s extglob; echo "$ {fullpath ## $ rootdir * (/)}" ' –

+0

No se puede usar para mi ejemplo, tengo' one = "branch_name_something" 'and' two = "branch_name_" '. Quiero imprimir solo "algo" "desde $ uno. Por lo tanto, probé' echo $ {# $ {two} one} 'pero arroja' -bash: $ {# $ {two} one}: mala sustitución'. No estoy seguro de qué me estoy perdiendo. –

8

Para utilizar variables en SED, debe utilizar de esta manera:

sed "[email protected][email protected]@g" FILE 

dos cosas:

  • utilizo comillas dobles (cáscara no se expande variables en comillas simples)
  • uso otro separador para que no entre en conflicto con las barras en sus caminos

Ej:

$ rootpath="/media/some path/dir" 
$ fullpath="/media/some path/dir/helloworld/src" 
$ echo "$fullpath" 
/media/some path/dir/helloworld/src 
$ echo "$fullpath" | sed "[email protected][email protected]@" 
/helloworld/src 
+0

¡Sí, gracias! Y es tan simple – gontard