仅当一行不以

  • 本文关键字:一行 regex bash grep gnu
  • 更新时间 :
  • 英文 :


>我在这篇文章的底部放了一个测试文件,并给出了预期的结果

我想要什么


我在文件夹中有一些文件,例如:

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(换行)字符。

请参阅正则表达式演示。

相关内容

  • 没有找到相关文章

最新更新