我正在尝试匹配我的文件中的字符串,该字符串以imports: [
开头且不包含SharedModule
。它可以在两个字符串之间包含任何数字或空格,换行符或其他字符(单词)。我一直试图找到那些:
grep 'imports: \[[.*\s*]*SharedModule' */*.module.ts
但我甚至找不到包含'SharedModule'的文件。我的思维过程是。*会找到任何单词而\ s会找到空格字符,带*选择器的字符类会允许它以任何顺序显示。
谢谢! (我是新手,到目前为止我学到的一件事是:正则表达很难)
样本匹配:
imports: [
IonicPageModule.forChild(FormPage),
DynamicFormComponentModule,
SharedModule
],
不应该匹配
imports: [
IonicPageModule.forChild(LeadershipPage),
],
应。
答案 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 support和negative 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),
],