정규식을 사용하여 원하는 것으로 변환하려는 수천 줄에 다음 패턴이 있습니다.
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