2012-02-08 4 views
0

구성 파일의 {$pear_root} 인스턴스를 쉘 스크립트의 $PEAR_ROOT 변수로 바꾸려고합니다. "배쉬 이스케이프 문자에 대한 메모"에서 here의 방법을 사용하여간단한 BASH 문자열 바꾸기

내가 가진 :

ESC_PEAR_ROOT="${PEAR_ROOT//\//\\/}" 
sed -i "s/{\$pear_root}/${ESC_PEAR_ROOT}/"../.serverconfig/test.txt 

을 내가 다시 (34) 받고 있어요 :이 지원되지 않는 것을 의미 할 수있다 생각 나쁜 대체합니다.

또는 perl을 사용하여이 작업을 수행 할 때 동일한 오류가 발생하므로이 문제는 s/find/replace/을 사용하는 것으로 보입니다.

APP_ROOT=$(php ./scripts/get_realpath.php '../') 
PEAR_ROOT="$APP_ROOT/pear" 
ESC_PEAR_ROOT="${PEAR_ROOT//\//\\/}" 
sed -e "s/{\$pear_root}/${ESC_PEAR_ROOT}/"../.serverconfig/test.txt 

그리고 PEAR_ROOT에서 경로로 대체 test.txt{$pear_root}의 모든 인스턴스와 끝까지 :

이 작업을 수행하는 가장 간단한 방법은 무엇입니까?

저는이 방법에 붙어 있지 않습니다. 신뢰할 수있는 것은 무엇이든 할 수 있습니다.

+0

:

최종 결과로 결국? 예를 들어 줄 수 있습니까? –

+0

표현의 두 번째 부분에서 $를 벗어나지 않았습니다. – John3136

+0

@evil otto : ESC_PEAR_ROOT는 모든 슬래시가 있어야했던 곳으로 끝날 것이라고 생각합니다. 나는이 한 문장을 위해 그것을 필요로하지만 나중의 사용을 위해 원래의 PEAR_ROOT도 필요로한다. PEAR_ROOT을 벗어나면 나중에 경로로 사용할 수 없습니다. – Eli

답변

2

좋아, 해결했습니다.

문제였다 :

이 :

ESC_PEAR_ROOT="${PEAR_ROOT//\//\\/}" 

이를 했어야 내 "나쁜 대체"오류의 원인이 된 것이었다

ESC_PEAR_ROOT="{PEAR_ROOT//\//\\/}" 

.

또한 탈출 할 필요가 없다는 것을 깨달았습니다. 다른 분리 기호를 사용할 수 있기 때문에 탈출 할 필요가 없었습니다. 따라서이 줄이 필요하지도 않습니다. 당신이 ESC_PEAR_ROOT에 대신 PEAR_ROOT을 설정하기 위해 시도하고있는 무슨

APP_ROOT=$(php ./scripts/get_realpath.php '../') 
PEAR_ROOT="$APP_ROOT/pear" 
sed -i "s#{\$pear_root}#${PEAR_ROOT}#g" ../.serverconfig/test.txt 
3

이것은 다소 어리 석었지만 표현식의 끝과 적용하려는 파일의 이름 사이에 공백이 없음을 알았습니다.

/tmp $ sed -e 's/{$pear_root}/'"$PATH"'/' test 
/tmp $ sed -e 's/{$pear_root}/'"$PATH"'/'test 
sed: bad option in substitution expression 
+0

네, 잘 잡으십시오.나는 그것을 고쳤다. 그러나 여분의 "$"는 그것을 죽이고 있었던 것이다. – Eli