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

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

내 프로젝트 중 하나를 모두 바꾸려고합니다.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와 같은 것들은 \wERE가 있는 다른 문자 클래스 내에서 사용할 수 없습니다(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)

관련 정보