전부 교체하려고 합니다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)