SED:将JSDOC的@link转换为Markdown [链接](...)

时间:2018-02-01 06:40:52

标签: regex bash awk sed

免责声明:我得到了:

cat GUIDE.md  | sed 's/{@link \([^#]*\)#\([^ ]*\)}/[\1#\2](https:\/\/mercmobily.github.io\/best-webdriver\/\1#\2/g'  | less

所以,它几乎功能。

我有一个GUIDE.md文件,该文件是纯粹的markdown,但它包含JSDOC链接。

我需要扫描GUIDE.md文件并更改它们:

Remember that in {@link Browser#setAlwaysMatchKey AlwaysMatch} or {@link Browser#setRootKey}  (all of the {@link Browser Browser} class), you must try [...]

分为:

Remember that in [AlwaysMatch](https://mercmobily.github.io/best-webdriver/Browser#setAlwaysMatchKey) or [Browser#setRootKey](https://mercmobily.github.io/best-webdriver/Browser#setRootKey) (all of the [Browser](https://mercmobily.github.io/best-webdriver/Browser) class), you must try [...]

基本上是这样的:

{@link Class#method Description}
->
[Description](https://mercmobily.github.io/best-webdriver/Class.html#method)

{@link Class#method}
->
[Class#method](https://mercmobily.github.io/best-webdriver/Class.html#method)

其中#method是可选的,所以:

{@link Class Description}
->
[Description](https://mercmobily.github.io/best-webdriver/Class.html)

{@link Class}
->
[Class](https://mercmobily.github.io/best-webdriver/Class.html)

此时,我起身:

cat GUIDE.md  | sed 's/{@link \([^#]*\)#\([^ ]*\)}/[\1#\2](https:\/\/mercmobily.github.io\/best-webdriver\/\1#\2/g'  | less

然而:

  • #method不是可选的:它必须在那里。如何使其成为非强制性的?

  • 根本不考虑该描述。这很棘手,我想知道一个SED正则表达式是否可以做到这一点。基本上,输入可以是{@link Class#method blah blah}(链接文字应为blah blah{@link Class#method}(链接文字应为Class#method

如果制作一个包含可选正则表达式的正则表达式太困难,我将不得不通过sed两次传递该文件。

想法?

1 个答案:

答案 0 :(得分:2)

可以使用以下两个sed替换(可以使用换行符或;或多个-e表达式分隔),不知道如何使用sed中的一个替换:

sed  '
s/{@link \([^} #]*\)\(#[^} #]*\)\? \([^} ]*\)}/[\3](https:\/\/mercmobily.github.io\/best-webdriver\/\1.html\2)/g
s/{@link \([^} #]*\)\(#[^} #]*\)\?}/[\1\2](https:\/\/mercmobily.github.io\/best-webdriver\/\1.html\2)/g
' << 'END'
{@link Class#method Description}
{@link Class#method}
{@link Class Description}
{@link Class}
END

注意,为了避免逃避/,可以使用另一个分隔符,,例如:

sed  '
s,{@link \([^} #]*\)\(#[^} #]*\)\? \([^} ]*\)},[\3](https://mercmobily.github.io/best-webdriver/\1.html\2),g
s,{@link \([^} #]*\)\(#[^} #]*\)\?},[\1\2](https://mercmobily.github.io/best-webdriver/\1.html\2),g
' << 'END'
{@link Class#method Description}
{@link Class#method}
{@link Class Description}
{@link Class}
END

否则perl可以在一个

中完成
perl -pe 's/\{\@link ([^} #]*)(#[^} #]*)?(?: ([^} ]*))?\}/"[".($3?$3:$1.$2)."](https:\/\/mercmobily.github.io\/best-webdriver\/$1.html$2)"/ge' << 'END'
{@link Class#method Description}
{@link Class#method}
{@link Class Description}
{@link Class}
END

请注意,表达式($3?$3:$1.$2)可以缩短($3||$1.$2)