Apache 재작성 규칙에 대한 패턴 정규식

Apache 재작성 규칙에 대한 패턴 정규식

정규식을 사용하여 원하는 것으로 변환하려는 수천 줄에 다음 패턴이 있습니다.

RewriteRule ^/omg/deadly-venom/?$ http://www.example.com/omg/deadly-venom [L,NC,R=301]
RewriteRule ^/buzz/get-on-it/?$ http://www.example.com/buzz/get-on-it/ [L,NC,R=301]

그리고 수천 개의 다른 유사한 라인

그래서 기본적으로 나는 이것을 원한다

RewriteRule ^/omg/(deadly-venom)/?$ http://www.example.com/omg/$1 [L,NC,R=301]
RewriteRule ^/buzz/(get-on-it)/?$ http://www.example.com/buzz/$1 [L,NC,R=301]

어떻게 이를 달성할 수 있나요? 저는 Sublime 텍스트 편집기를 사용하지만 터미널에서 sed나 awk를 사용할 수도 있습니다.

업데이트: 마지막 항목은 /이와 같이 이전에 이중 슬래시를 생성해서는 안 됩니다. 대신 끝이 있는 줄과 없는 줄을 보려면 위에서 앞뒤를 살펴봐야 합니다.$1//$1/$1/

답변1

나는 이렇게 할 것이다:

sed -E 's|(.*/)([^/]*)(/\?\$.*)\2/{,1}|\1(\2)\3$1|' infile

두 번째 그룹은 포함되어야 하는 문자열/패턴을 캡처하고 세 번째 그룹은 (...)동일한 문자열(LHS에서 역참조됨) 뒤의 모든 항목을 캡처합니다(가능한 경우 후행 슬래시 포함). \2따라서 기본적으로 이는 확장 정규식을 지원하지 않는 경우 다음 \1\2\3\2{0 or 1 slash}으로 대체됩니다 \1(\2)\3$1.
sed-E

sed 's|\(.*/\)\([^/]*\)\(/?\$.*\)\2/\{,1\}|\1(\2)\3$1|' infile

관련 정보