如何匹配[]组内的任意字符?

dot*_*hen 0 regex linux bash grep

我找了所有组合foo和bar无论哪个顺序,这可能会在多行运行(在实践中,超过5行不再).这是一个测试文件:

$ cat test
foo
a
  bar
b
1 foo 2 bar 3
1 foo2bar 3




bar
a
  foo
b
1 bar 2 foo 3
1 bar2foo 3
Run Code Online (Sandbox Code Playgroud)

使用时,我无法将单个字符与换行符匹配pcregrep.我可以很好地匹配所有单个字符:

$ pcregrep --color -Mi '(foo.*bar)?(bar.*foo)?' test
test:1 foo 2 bar 3
test:1 foo2bar 3
test:1 bar 2 foo 3
test:1 bar2foo 3
$
Run Code Online (Sandbox Code Playgroud)

然而,可以看出多线foo/bar组合不匹配.因此,我尝试匹配所有字符\.和换行符,\n但这不会返回任何行:

$ pcregrep --color -Mi '(foo[.\n]*bar)?(bar[.\n]*foo)?' *
$
Run Code Online (Sandbox Code Playgroud)

事实上,我似乎无法.在一个[]组中与运算符匹配和单个字符:

$ pcregrep --color -Mi '(foo[.]*bar)?(bar[.]*foo)?' *
$ pcregrep --color -Mi '(foo[\.]*bar)?(bar[\.]*foo)?' *
$
Run Code Online (Sandbox Code Playgroud)

如何将.操作员置于一个[]组内?

Cas*_*yte 7

点与新线不匹配,您可以使用单线修改器(?s),允许点匹配换行符(或用点替换点[\s\S])

pcregrep --color -Mi '(?s)(foo.*?bar)?(bar.*?foo)?' test
Run Code Online (Sandbox Code Playgroud)

要么

pcregrep --color -Mi '(?s)(?|foo(.*?)bar|bar(.*?)foo)' test
Run Code Online (Sandbox Code Playgroud)

或者干脆:

pcregrep --color -Mi '(?s)(foo.*?bar|bar.*?foo)' test
Run Code Online (Sandbox Code Playgroud)

如果在字符类中放置正则表达式特殊字符,则将其视为文字.