2014-10-02 3 views
0

나는 우리 사이트를 살펴보고 암호화 된 하드 경로를 제거하고 쉘 연결을 통해 $ _SERVER [ 'DOCUMENT_ROOT']로 바꾸려고했지만 올바르게 이스케이프 처리하는 방법을 모르겠습니다. 여기BASH 이스케이프에 대한 Sed

$_SERVER['DOCUMENT_ROOT']."/template

으로

"/home/imprint/public_html/template

을 대체 할

필요 내가 그것을 발견 것입니다,하지만 난 또한 포함해야합니다. htm 파일과 나는 아니다. 내가 도망 가기 위해 필요한 것.

find . -name '*.php' -exec sed -i 's/"/home/imprint/public_html/template/$_SERVER['DOCUMENT_ROOT']."/template/g' {} \; 

또한 sed에서 -i 옵션은 무엇을합니까?

답변

2

당신은 당신이 나오지 s 명령에 대한 서로 다른 구분 기호를 사용하는 경우 -o ("또는")와 절
를 찾을 결합 할 수 있습니다, 당신은 아무것도 탈출 할 필요가 없습니다. 다른 하나는 고정 문자열을 교체하는 경우

search='"/home/imprint/public_html/template' 
replace='$_SERVER['DOCUMENT_ROOT']."/template' 

find . -name '*.php' -o -name '*.htm' \ 
     -exec sed -i "s#${search}#${replace}#g" {} + 

당신보다는 작은 따옴표로 나오지도 사용할 수 있습니다, 호출 시간 sed의 수를 줄여 효율을 얻을 수 -exec ... + 대신 -exec ... \;

+0

.htm 파일 만 찾는 중입니다 ... – EricImprint

+0

이 파일은 찾기에 효과적이지만 명령을 찾을 수 없다는 오류가 표시됩니다. > 찾기. \ (-name '* .php'-o -name '* .htm'\) – EricImprint

+0

사용 된 명령과 오류 메시지를 질문에 올바른 형식으로 복사 할 수 있습니까? –

0

의 사용 $ 기호 또는 다른 예측되지 않은 funkiness의 해석을 막을 것입니다.

pates를 대체하기 때문에 fyi는/sed의 구분 기호 (예 : sed "s=abc=def=g")보다 다른 문자를 사용할 수 있습니다.이 문자는 아마도 더 명확합니다.

-i[SUFFIX], --in-place[=SUFFIX] 
edit files in place (makes backup if extension supplied) 
0

어쩌면 당신이 다음

shopt -s globstar 
perl -i.bak -pe 's:/home/imprint/public_html/(template):\$_SERVER['DOCUMENT_ROOT']/$1:' ./**/*.php 
  • .bak
  • ./**/*.php이 recusively 모든 PHP 파일을 검색 할 백업 파일을 생성합니다 시도 할 수 있습니다 : man 페이지에서

    globstar 옵션이 설정된 경우
관련 문제