我有一个旧维基,我正在转换为使用Markdown和[[]]
维基链接格式的新维基。不幸的是,旧维基真的旧,并且许多生成链接的方式,包括。 CamelCase,单括号([]
)wiki链接等。
我正在使用sed
中的正则表达式进行转换,并使用以下正则表达式将独立的CamelCase链接转换为双括号([[]]
)wiki链接:
s/([^[|])([A-Z][a-z]+[A-Z][A-Za-z]+)([^]|])/\1\[\[\2\]\]\3/g
不幸的是,上面的一个问题(我试图在现有的单括号wiki链接中没有转换CamelCase,因为两者兼而有之)就是像[BluetoothConnection|UsingBluetoothIndex]
这样的东西会被转换为{{1 }}
如何解决此问题并强制匹配更贪婪,因此失败并且在这种情况下不进行替换?如果[BluetoothConnection|Using[[BluetoothInde]]x]
增强的正则表达式过于局限,我愿意通过sed
代替perl
。
答案 0 :(得分: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为你的问题设置正则表达式。所以这就是:
perl -pe 's#(^|\b)((?![|\[])[A-Z][a-z]+[A-Z][A-Za-z]+(?![|\]]))($|\b)#\[\[\2\]\]#g'
echo "BluetoothConnection" | perl -pe 's#(^|\b)((?![|\[])[A-Z][a-z]+[A-Z][A-Za-z]+(?![|\]]))($|\b)#\[\[\2\]\]#g'
Output: [[BluetoothConnection]]
echo "[BluetoothConnection|UsingBluetoothIndex]" | perl -pe 's#(^|\b)((?![|\[])[A-Z][a-z]+[A-Z][A-Za-z]+(?![|\]]))($|\b)#\[\[\2\]\]#g'
Output: [BluetoothConnection|UsingBluetoothIndex]
它所做的只是检查文本是否以“|”开头或'['而不是以|
或]
结尾,然后将其括在[[
和]]
中。