.png)
내 프로젝트 중 하나를 모두 바꾸려고합니다.mysql에서 mysqli로, 해당 매개변수와 함께. 그러기 위해 내 폴더에서 mysql이 포함된 모든 파일을 재귀적으로 검색하여 mysqli로 대체합니다.
전:
mysql_query($query)를 mysqli_query($link, $query)로
Regex 테스터에 따르면 모든 것을 캡처할 수 있지만 아무것도 교체되지 않은 것 같았고 오류도 없습니다.
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
글렌은 캡처가 없는 솔루션을 제안했습니다. 하지만 수정하고 싶다면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)