SED 명령이 대체되지 않음(정규식 작동)

SED 명령이 대체되지 않음(정규식 작동)

전부 교체하려고 합니다mysql에서 mysqli로, 및 해당 매개변수입니다. 이를 위해 폴더에서 mysql이 포함된 모든 파일을 재귀적으로 검색하여 mysqli로 바꿉니다.

전임자:

mysql_query($query)를 mysqli_query($link, $query)로

(정규식 테스터에 따르면) 모든 것을 잡을 수 있지만 아무것도 교체되지 않은 것 같고 오류도 없습니다.

grep -rl mysql PROJECTFILE | xargs sed -ri "s/(mysql_query)\(\$([\w-]+)\)/WhatIWant/g"

백슬래시에 대해 읽었습니다.sed그러나 출력에는 오류가 없지만 파일은 변경되지 않은 채 유지됩니다. 예시나 설명을 통해 무엇이 부족한지 알 수 있다면 더할 나위 없을 것 같습니다.

mysql을 mysqli로 바꾸는 것은 쉽지만 모든 작업을 한 번에 수행하는 것이 가장 좋습니다. 내 프로젝트에서 시도하기 전에 작동하는지 확인하기 위해 임시 파일을 사용하고 있습니다.

감사해요.

편집하다: 한 번에 다 하려면 캡쳐를 해야 한다는 걸 알았거든요.mysql혼자 추가, 그러나 이것은 단지 아이디어일 뿐입니다.


tedron의 경우 내가 원하는 출력은 다음과 유사합니다.

sed -ri "s/(mysql_query)\(\$([\w-]+)\)/mysqli_query($link, \2)/g" filename

Glenn은 캡처가 필요 없는 솔루션을 생각해 냈습니다. 하지만 수정하고 싶다면mysql_fetch_array($쿼리), 첫 번째 매개변수를 유지하고 추가하려면 정규식을 사용해야 할 수도 있습니다.MYSQLI_BOTH예를 들어.


해결책:

tedron 덕분에 나는 내 문제를 내가 했던 방식으로 해결할 수 있었습니다:

sed -ri 's/(mysql)_query\((\$[a-zA-Z_-]+)\)/\1i_query($link, \2)/' filename

mysqli_fetch_array의 경우:

sed -ri 's/(mysql)(_fetch_array)\((\$[a-zA-Z_-]+)\)/\1i\2(\3, MYSQLI_BOTH)/' filename

질문에서 했던 것처럼 이를 사용하여 디렉토리를 즉시 수정하십시오 grep.

답변1

아무것도 캡처할 필요가 없습니다.

sed 's/mysql_query(/mysqli_query($link, /g' file

-i테스트 중에는 사용하지 마시고, 결과가 만족스러우면 추가하세요.

답변2

확장 정규식을 사용하는 또 다른 방법( ) -r:

sed -r 's/(mysql)(_query\()/\1i\2$link,/g'

답변3

mysql_query캡처 그룹 을 대체 그룹에 복사하지 않으므로 캡처 그룹을 둘러쌀 필요가 없습니다 . 쿼리 매개변수는 호출마다 다르기 때문에 캡처하기만 하면 됩니다.

sed -ri 's/mysql_query\s*\((\$\w+)\)/mysqli_query($link, \1)/g'

답변4

문제는 \w여기서 무슨 일이 일어나고 있는지 알아내려고 노력하는 동안 이것을 직접 발견했지만 유사하거나 \s이미 \w문자 클래스인 것들은 ERE가 있는 다른 문자 클래스에서 사용할 수 없다는 것입니다(PCRE와 함께 사용할 수 있습니다). 표시하려면:

$ echo foo- | sed -r 's/[\w-]+/bar/'
foobar
$ echo 'w\-foo' | sed -r 's/[\w-]+/bar/'
barfoo
$ echo foo- | sed -r 's/\w+/bar/'
bar-

따라서 문자 클래스 내에서 문자 이스케이프 클래스는 리터럴 문자로 처리됩니다 [ ]. 이 표현은 [\w-]" \, 또는 w중 하나 와 일치함을 의미합니다 -.

정규식을 작동시키려면 [a-zA-z_]대신 사용 \w하거나 그룹화 괄호를 사용하십시오.

$ echo 'mysql_query($query)' | 
    sed -r 's/mysql_query\(\$(\w|-)+\)/WhatIWant/'
WhatIWant

귀하를 위한 구체적인 예:

$ echo 'mysql_query($query)' | 
    sed -r 's/(mysql_query)\((\$[a-zA-Z_-]+)\)/\1($link,\2)/'
mysql_query($link,$query)

관련 정보