如何在ugrep中获取匹配的模式

问题描述 投票:0回答:1

我创建了一个ugrep命令和文件

ugrep -Hn -e 'Error:XX234 - \S+\.txt : cannot find user' -e 'Error:XX235 - \S+\.pdf : cannot find data' --format='%f:%n:%o%~'  *

文件内容

1_Error0: rwPqdEPE.txt - YjTccJITSpALx1B8cORN
ErrorXX235 - xyz.pdf : cannot find data
Error:XX235 - xyz.pdf : cannot find data
Error:XX234 - abc.txt : cannot find user

输出

在此输入图片描述

我期待以下输出:

  1. 显示错误匹配的模式

上面只是一个示例 ugrep 命令。我的实际命令会像下面这样很大

ugrep -Hn -e pattern1 -e pattern2 -e patternN --format='%f:%n:%o%~' *

预期产量

issue.txt:12:Error:XX235 - xyz.pdf : cannot find data:<pattern2>
issue.txt:13:Error:XX234 - abc.txt : cannot find user:<patternN>
regex grep full-text-search
1个回答
0
投票

检查

ugrep
手册页

参见

ugrep --help format
man ugrep
部分
FORMAT
了解详情。 当指定选项
-o
时,选项
-u
也已启用。 上下文选项
-A
-B
-C
-y
将被忽略。

我没有找到任何方法来包含匹配的

regexp
模式与
--format
选项。

另一种解决方案,

awk

此脚本从第一个文件中读取正则表达式并将其应用于其余文件。

# regexp.awk
BEGIN {
    # Read regular expressions from the first file
    while ((getline line < ARGV[1]) > 0) {
        regexps[++i] = line
    }
    # Remove the first file from the list of files to be processed
    ARGV[1] = ""
}

{
    # Apply each regular expression to each line of each file
    for (j = 1; j <= i; ++j) {
        if ($0 ~ regexps[j]) {
            print FILENAME ":" FNR ":" $0 ":" regexps[j]
        }
    }
}

您可以使用以下命令运行此

awk
脚本:

awk -f regexp.awk regexp_file.txt [target_files_list...]

在此命令中,将

"regexp_file.txt"
替换为包含正则表达式的文件的名称,将
target_files_list
替换为要搜索的文件的名称。该脚本将在一行中打印每个匹配项,格式为
filename:linenumber:matched line regular expression

这是一个简单的解决方案,如果您有大量正则表达式或大文件,则可能无法正常工作。如果性能是一个问题,您可能需要更复杂的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.