2013-03-08 2 views
0

find and replace in multiple files on command line에 제공된 답변을 사용하여 유닉스 명령 줄을 통해 모든 파일에서 복잡한 찾기 및 바꾸기를 시도하고 있지만 찾기 및 바꾸기 문자열을 올바르게 이스케이프 처리하지 못하는 것 같습니다. .유닉스 명령 줄에서 복잡한 찾기와 바꾸기

내가 포함하는 모든 라인을 찾을 필요가 :

find . -name '*.php' |xargs perl -pi -e 's/if\(\$session\[\'test\'\]\>0\){/if\(\$session\[\'test\'\]\>1\){/g' 

하지만 그 날을 제공합니다

if ($session['test']>0){ 

if ($session['test']>1){ 

명령 내가 노력하고있어로 교체하는 것입니다 그 명령이 나를 거기서 알려주기 때문에 다른 문자를 입력해야만하는 또 다른 프롬프트가 나타납니다. 터미네이션이없는 문자열입니다. 마지막에 '에 추가하면 다음과 같이 표시됩니다.

Unmatched) in regex; marked by <-- HERE in m/if\(\$session\[\test']>0) <-- HERE {/ at -e line 1. 

대체품을 어떻게 작동 시키나요?

+1

명령은 "생각하지"않습니다. 그들은 알고있다*. – alestanis

+0

쉘 보간이 문제가되면, 파일을 사용하여 정규 표현식을 잡고'xargs perl -pi file.pl'을 실행하십시오. – TLP

답변

2

그냥 따옴표 사용 또한

perl -pi -e "s/if\(\$session\[\'test\'\]\>0\){/if\(\$session\[\'test\'\]\>1\){/g" 

을, 당신은 if 뒤에 공백을 누락하고, 달러 기호는 세 개의 백 슬래시로 이스케이프 할 필요가 : 큰 따옴표와 이중 이스케이프를 사용

perl -pi -e "s/if \(\\\$session\[\'test\'\]\>0\){/if \(\\\$session\[\'test\'\]\>1\){/g" 
       ^^^^        ^^^ 
+1

큰 따옴표를 사용하면 명령을 성공적으로 수행 할 수 있지만 의도 한 바꿉니다. – nmc

+0

@nmc 편집 완료 – alestanis

2

$ 작품 :

perl -pi -e "s/if \(\\\$session\['text'\]>0\){/if (\\\$session['text']>1){/" 

보이지 않는 및 미리보기 어설 션을 가진 더 짧지 만 더러운 솔루션 :

perl -pi -e 's/(?<=if \(\$session\[.text.\]>)0(?=\){)/1/'