2012-03-25 5 views
11

내가 변수에서 문자열을 제거하기 위해 노력하고 이런 식으로 나오지 사용 나오지도 사용 :제거 문자열은

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

나는이 같은 fullpath에 단지 휴식을 에코 할

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

(내가 디렉토리의 전체 무리에이를 사용하고, 그래서 변수에 저장해야하고

echo "helloworld/src" 

USI 자동으로 할 ng 변수 일 수 있습니다.

echo "Directory: $PRINT_THIS" 

문제는 내가 부분 문자열을 제거하기 위해 sed를 할 수 없다는 것입니다.

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

두 가지를 : : 감사합니다

답변

25

당신은 혼자에 대한 sed, bash 필요하지 않습니다 충분 다음 String manipulation 문서

$ 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 

체크 아웃.

+0

스크립트에서 다른 곳에서 문자열 조작을 사용했기 때문에 그 재미있었습니다.하지만 잊어 버렸습니다. – rluks

+1

$ rootpath가 슬래시로 끝나는 지 모르면 다음을 할 수 있습니다 : shopt -s extglob; echo "$ {fullpath ## $ rootdir * (/)}"' –

+0

예를 들어 그것을 사용할 수 없다면, 나는 one = "branch_name_something"과'two = "branch_name_"'을 갖는다. $ 1에서 "something"을 출력하고 싶기 때문에'echo $ {# $ {two} one} '을 시도했지만'-bash : $ {# $ {two} one : bad substitution'을 던졌습니다. 내가 무엇을 놓쳤는 지 잘 모르겠다. –

8

은 다음과 같이 사용합니다 SED에서 변수를 사용하려면

  • 나는 따옴표 (쉘이 작은 따옴표로 변수를 확장하지 않음)
  • 사용
  • 경로의 슬래시와 충돌하지 않는 다른 구분 기호를 사용합니다.

예 :

$ 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

그래, 고마워! 그리고 그것은 매우 간단합니다 – gontard