2012-03-25 5 views
11

Próbuję wyjąć podciąg z zmiennej przy użyciu sed tak:Usuwanie podciąg z ciągu znaków za pomocą sed

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

gdzie

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

chcę echo tylko resztę fullpath jak ta (używam tego na całą masę katalogów, więc trzeba go przechowywać w zmiennych i zrobić to automatycznie

echo "helloworld/src" 

usi zmienna ng byłoby

echo "Directory: $PRINT_THIS" 

Problem w tym, że nie może dostać sed usunąć podciąg, co ja robię źle? Dzięki

Odpowiedz

25

Nie trzeba sed Do tego bash sam wystarczy:

$ 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 

Zapoznaj się z dokumentacją String manipulation.

+0

Dziękuję, to zabawne, ponieważ użyłem manipulacji ciągiem gdzie indziej w skrypcie, ale zapomniałem o tym – rluks

+1

Jeśli nie wiesz, czy $ rootpath kończy się ukośnikiem, możesz zrobić: 'shopt -s extglob; echo "$ {fullpath ## $ rootdir * (/)}" ' –

+0

Nie można go użyć do mojego przykładu, mam' one = "nazwa_grupy_rozmieszczenia" 'i' two = "nazwa_grupy_" '. Chcę wydrukować tylko "coś" "od $ 1. Więc próbowałem' echo $ {# $ {two} one} 'ale rzutuje' -bash: $ {# $ {two} one}: bad substitution'. Nie jestem pewien, czego mi brakuje. –

8

używać zmiennych w sed, należy używać go tak:

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

dwie rzeczy:

  • używam cudzysłowia (Shell nie rozszerzać zmienne w apostrofach)
  • Używam innego separatora, który nie jest w konflikcie z ukośnikami na ścieżkach.

Ex:

$ 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

Tak, dziękuję! I to jest takie proste – gontard