L::으로 시작하는 모든 상수에 괄호를 추가합니다(끝에 없는 경우).

L::으로 시작하는 모든 상수에 괄호를 추가합니다(끝에 없는 경우).

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/' '{}' +

관련 정보