2011-03-26 6 views
0

저는 Markdown과 [[]] 위키 링크 형식을 사용하는 새로운 위키로 변환하고있는 오래된 위키를 가지고 있습니다. 불행히도, 오래된 위키는 이며, 실제로는이고, 은 많은 링크를 생성하는 방법을 가지고 있습니다. CamelCase, 단일 브라켓 ([]) 위키 링크. 불행하게도정규 표현식을 파싱하는 위키 링크를 어떻게 수정할 수 있습니까?

s/([^[|])([A-Z][a-z]+[A-Z][A-Za-z]+)([^]|])/\1\[\[\2\]\]\3/g 

, 하나 개의 문제에 : 나는 ([[]]) 위키 링크 sed에서 정규 표현식 승/변환 두 번 브래킷에 독립형 낙타 표기법 링크를 변환하려면 다음 정규 표현식을 사용하고있어

위의 (기존의 단일 브라켓 Wiki 링크에서 CamelCase를 변환하지 않으려 고 시도한 결과) [BluetoothConnection|UsingBluetoothIndex]과 같은 것이 [BluetoothConnection|Using[[BluetoothInde]]x]으로 변환됩니다.

어떻게하면이 문제를 해결할 수 있습니까? 더 많은 욕심을 불러 일으켜 강제로 실패하고 대체 할 수 없습니까? sed의 확장 정규 표현식이 너무 제한적이라면, sed 대신 perl을 기꺼이 통과 할 의향이 있습니다.

+0

'[BluetoothConnection | UsingBluetoothIndex] 문자열에 예상되는 출력은 무엇입니까 – anubhava

+0

'[BluetoothConnection | UsingBluetoothIndex]'는 나중에 정규 표현식으로 처리하기 위해 그대로 두어야합니다. – morgant

답변

2

좋아 당신이 시도 할 수 있습니다 :

$ echo "UsingBluetoothIndex" | sed -E 's!([^\[\|]?)([A-Z][a-z]+[A-Z][A-Za-z]+)($|\b|[]|])!\1\[\[\2\]\]\3!g' 
Output: [[UsingBluetoothIndex]] 

$ echo "[BluetoothConnection|UsingBluetoothIndex]" | sed -E 's!([^\[\|]?)([A-Z][a-z]+[A-Z][A-Za-z]+)($|\b|[]|])!\1\[\[\2\]\]\3!g' 
Output: [[[BluetoothConnection]]|[[UsingBluetoothIndex]]] 

업데이트 :

가 좋아, 내가 지금은 perl's negative look behind directive를 사용하여 문제에 대한 정규식을 믿습니다. 그래서 여기에 있습니다 :

텍스트가 '|'로 시작하지 않는지 확인하고 있습니다. 또는 '['이고 | 또는 ]으로 끝나지 않으면 [[]]으로 묶으십시오.

+0

불행히도,'[[BluetoothConnection | UsingBluetoothIndex]]'는 [[[BluetoothConnection]] | [[UsingBluetoothIndex]]]'로 변환되지 않고 그대로 두어야합니다. – morgant

+0

아, 'sed'의 정규 표현식에서 특수 문자를 특수 문자로 백 슬래시 이스케이프해서는 안됩니다 ('^'대신 '^'가 붙지 않아야 함). 이해할 수있는 특정 위치에 배치). 'man re_format'을 보라. 적어도 이것은 BSD/Mac OS X (내가 실행 중임)의 경우입니다. – morgant

+0

@morgant : perl을 사용하여 문제에 대한 대체 솔루션을 제공했습니다. 위의 업데이트 섹션을 참조하십시오. – anubhava

관련 문제