>我在这篇文章的底部放了一个测试文件,并给出了预期的结果
我想要什么
我在文件夹中有一些文件,例如:
src
├── app
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ └── interceptor
│ └── json-api.interceptor.ts
├── auth
│ ├── auth.controller.ts
│ ├── auth.module.ts
│ ├── auth.service.ts
│ ├── decorator
│ │ ├── auth-user.decorator.ts
│ │ ├── is-secret.decorator.ts
我想要一个脚本,将我的jsdoc
检索到这个文件中,加上jsdoc所关注的函数的名称,并将结果插入到.md
文件中。
jsdoc
总是以新行开始/**
,总是在新行中结束*/
。
开始和结束之间的线总是由*
开始。
在 jsdoc 的结束行之后,我们有@
或[A-Za-z]
.只有当模式不等于@
时,我才想匹配这条线。
例:
/** << start
* << the line between
*/ << end
@ xxxxxx << possible negative value
function xxxxx << possible positive value
const xxxx << possible positive value
xxxxx << possible positive value
但我不想检索以下模式:
/** something */
@ or xxxxxx
我的研究
我从jsdoc开始:
grep -Pro "(/**$)|(^s+*s.*)|(^s+*/$)" test.txt
结果是好的:
➜ grep -Pro "(/**$)|(^s+*s.*)|(^s+*/$)" test.txt
/**
* check if the user level is super admin
* @returns {boolean} true if the user has the right to access super admin endpoints
*/
/**
* check if the user level is super admin
* @returns {boolean} true if the user has the right to access super admin endpoints
*/
/**
* check if the user level is super admin
* @returns {boolean} true if the user has the right to access super admin endpoints
*/
现在我想在后面有一行,如果这条行不是以@
开头,为此我已经做了这个正则表达式
((s*)([^@]|w)(.*))
但这根本行不通。
如果我使用负数预视(s*)(?![@])(.+)
控制台告诉我event not found: [@])(.+)
.
我很迷茫,如果你知道如何做到这一点,谢谢。如果您想了解更多信息,请告诉我。
测试文件和预期结果
<小时 />➜ cat test.txt
// case 1
/**
* check if the user level is super admin
* @returns {boolean} true if the user has the right to access super admin endpoints
*/
@UseGuards(AuthGuard('jwt'), LevelsGuard)
@Levels(LevelEnum.superadmin)
@Get('check/superadmin')
@ApiBearerAuth()
checkSuperAdminLevel(): boolean {
return true;
}
// case 2
/**
* check if the user level is super admin
* @returns {boolean} true if the user has the right to access super admin endpoints
*/
@Get('check/superadmin')
@ApiBearerAuth()
checkSuperAdminLevel(): boolean {
return true;
}
// case 3
/**
* check if the user level is super admin
* @returns {boolean} true if the user has the right to access super admin endpoints
*/
checkSuperAdminLevel(): boolean {
return true;
}
// case 4
/** lorem ipsum */
// case 5
lorem ipsum
预期结果
// case 1
/**
* check if the user level is super admin
* @returns {boolean} true if the user has the right to access super admin endpoints
*/
checkSuperAdminLevel(): boolean {
// case 2
/**
* check if the user level is super admin
* @returns {boolean} true if the user has the right to access super admin endpoints
*/
checkSuperAdminLevel(): boolean {
// case 3
/**
* check if the user level is super admin
* @returns {boolean} true if the user has the right to access super admin endpoints
*/
checkSuperAdminLevel(): boolean {
// case 4
nothing
// case 5
nothing
由于您使用的是 GNUgrep
,因此可以实现您想要的扩展正则表达式
。首先,添加-z
选项,它将允许将文件转换为单个字符串输入(grep
模式将"看到"换行符)。
其次,您需要确保$
锚点匹配行尾,而不仅仅是整个字符串,因此您需要多行修饰符(?m)
。
第三,换行符也需要匹配才能在输出中使用换行符,因此,在每个备选方案的末尾,您需要放置n?
,一个可选的换行符。
第四,由于这是一个PCRE模式,它将支持h
构造,匹配任何水平空格。当您的正则表达式可以跨行匹配时,这是一种方便的模式。注意s
匹配换行符,这可能会导致不受欢迎的匹配。因此,所有s
都替换为h
.
第五,由于形态将消耗*/
线,并且您想开始寻找一条不以@
开头的线,并且仅在该线正下方,因此您需要一个积极的回溯,一个非消耗形态。
因此,grep 命令将如下所示
grep -zroP '(?m)/**$n?|^h+*h.*$n?|^h+*/$n?|(?<=*/n)(?:h+@.*n)*K.+n?' test.txt
(?<=*/n)(?:h+@.*n)*K.+n?
替代方案是这样做的:
(?<=*/n)
- 查找紧靠*/
和换行符的位置(?:h+@.*n)*
- 匹配并消耗任何零个或多个重复h+
- 一个或多个水平空格@
-@
炭.*n
- 带有换行符 (LF) 字符的行的其余部分
K
- 匹配重置运算符,丢弃从总体匹配内存缓冲区中匹配
的文本.+
- 非空行n?
- 可选的 LF(换行)字符。
请参阅正则表达式演示。