如何在ack输出中使用命名的正则表达式组?

Ste*_*Chu 12 regex perl ack

假设我有一个包含以下内容的foo.txt文件:

[2010-11-13 12:00:02,656]
[2010-11-13 12:00:02,701]
[2010-11-13 12:00:02,902]
Run Code Online (Sandbox Code Playgroud)

当我ack使用以下日期部分时,它的工作原理是:

ack "(?P<foo>\d{4}-\d{2}-\d{2})" foo.txt --output "\$1"

2010-11-13
2010-11-13
2010-11-13
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用--output命名组"foo"时,我无法让它工作:

ack "(?P<foo>\d{4}-\d{2}-\d{2})" foo.txt --output "(?P=foo)"

(?=foo)
(?=foo)
(?=foo)
Run Code Online (Sandbox Code Playgroud)

任何帮助都非常感激.非常感谢.

cjm*_*cjm 18

ack "(?P<foo>\d{4}-\d{2}-\d{2})" foo.txt --output "\$+{foo}"
Run Code Online (Sandbox Code Playgroud)

(?P=foo)只能正则表达式中使用(它是命名的等价物\1). $+{foo}是命名的等价物$1.

此外,对于大多数shell,单引号将帮助您避免额外的反斜杠:

ack '(?P<foo>\d{4}-\d{2}-\d{2})' foo.txt --output '$+{foo}'
Run Code Online (Sandbox Code Playgroud)

  • `(?P <name> ...)`的'P`部分是可选的.也就是说,一个简单的`(?<name> ...)`就足够了. (4认同)