PHP 파일이 많고 "("로 끝나지 않는 "L::"으로 시작하는 모든 상수에 "()"로 끝나는 것을 추가해야 합니다. 하위 폴더를 포함한 모든 *.php에 적용해야 합니다.
L::WHAT_EVER
<?=L::WHAT_EVER?>
다음과 같아야 합니다:
L::WHAT_EVER()
<?=L::WHAT_EVER()?>
하지만 그 중 어느 것도 만지지 마세요:
L::WHAT_EVER()
L::WHAT_EVER('aaa')
L::WHAT_EVER($a, $b)
이를 달성하기 위해 적용할 수 있는 sed 정규식 명령이 있습니까?
답변1
다음을 사용하는 것이 더 쉽습니다 perl
.
perl -pi -e 's/\bL::\w++\K(?!\()/()/g' ./*.php
\bL::
:L::
단어 경계를 따릅니다(대체를 피하기 위해NIL::Foo
).\w
: 임의의 단어 문자(ASCII 문자, 숫자 또는 밑줄)++
: 하나 이상\w
이지만 역추적하지 않음\K
: 일치하는 부분의 시작 부분을 설정합니다(단어 바로 뒤).(?!...)
: 미리보기 어설션을 무효화합니다. 따라서 이는 다음에 오는 내용이 가 아닌 경우에만 일치합니다(
.
답변2
GNU sed 테스트를 위한 둘러보기 기능이 있으므로 Perl과 더 나은 정규식 엔진을 사용하면 더 쉽습니다.
sed -E 's/(\w+::\w+)([^(].+)?/\1()\2/' ./*.php
재귀적 글로브 프로세스를 해결합니다.
find . -iname '*.php' -exec sed -E 's/(\w+::\w+)([^(].+)?/\1()\2/' '{}' +
실제 편집을 위해서는 -i 옵션을 추가하세요.
find . -iname '*.php' -exec sed -i -E 's/(\w+::\w+)([^(].+)?/\1()\2/' '{}' +