如何在两个固定字符串之间匹配模式与不相关的字符/空格?

时间:2017-08-14 17:04:33

标签: regex grep multiline

我正在尝试匹配我的文件中的字符串,该字符串以imports: [开头且不包含SharedModule。它可以在两个字符串之间包含任何数字或空格,换行符或其他字符(单词)。我一直试图找到那些:

grep 'imports: \[[.*\s*]*SharedModule' */*.module.ts

但我甚至找不到包含'SharedModule'的文件。我的思维过程是。*会找到任何单词而\ s会找到空格字符,带*选择器的字符类会允许它以任何顺序显示。

  1. 我可以使用这样的字符类来跳过可变数量的不相关的行/字符吗?
  2. 如何否定语句,以便返回没有'SharedModule'的行?
  3. 目标是将'SharedModule'附加到导入数组中的任何位置。
  4. 谢谢! (我是新手,到目前为止我学到的一件事是:正则表达很难)

    样本匹配:

    imports: [
      IonicPageModule.forChild(FormPage),
      DynamicFormComponentModule,
      SharedModule
    ],
    

    不应该匹配

    imports: [
      IonicPageModule.forChild(LeadershipPage),
    ],
    

    应。

3 个答案:

答案 0 :(得分:1)

默认情况下,

grep不会处理多行字符串。 gnu grep -z选项可以使用此功能,但正则表达式会更复杂。

使用自定义gnu awk的{​​{1}}解决方案(记录分隔符)可能会更好:

RS

awk -v RS='imports:[[:blank:]]*\\[[^]]*\\],[[:space:]]+' 'RT !~ /SharedModule/{ORS=RT} 1' file imports: [ IonicPageModule.forChild(LeadershipPage), ], 内容是这样的:

file

答案 1 :(得分:0)

有一个使用Pzo option for multiline supportnegative lookahead的grep解决方案:

Import-DscResource -ModuleName hApplyGpo

这将返回不包含 SharedModule 字的导入语句。

答案 2 :(得分:0)

您可以通过围绕它们使用一些编程逻辑来简化正则表达式的要求。

这里有POSIX awk

$ awk '/\[/ {f=1} 
       f{s=s $0 ORS} 
       /\]/{if (index(s, "SharedModule")==0) print s; f=0; s=""}' file
imports: [
    IonicPageModule.forChild(LeadershipPage),
],

说明:

 /\[/ {f=1}             # if [ in line, set a flag
 f{s=s $0 ORS}          # if that flag is set, copy the input to the string s
 /\]/                   # closing ] in line
                        # print and reset
 {if ({if (index(s, "SharedModule")==0) print s; f=0; s=""}) print s; f=0; s=""}  

使用此文件:

$ cat file
imports: [
    IonicPageModule.forChild(FormPage),
    DynamicFormComponentModule,
    SharedModule
],

imports: [
    IonicPageModule.forChild(LeadershipPage),
],