gpt4 book ai didi

regex - 匹配模式后停止 grep,而不是整行?长行/单行文件

转载 作者:行者123 更新时间:2023-12-01 11:06:18 29 4
gpt4 key购买 nike

我正在使用 grep 仅返回多个文件中模式 (-o) 之间的字符串,例如

grep -i -r -o 'Rows="[^#][^"]*"' *

我希望它在第一个匹配模式后停止,我试过 grep -m NUM/--max-count=NUM但这会在 NUM 匹配 后停止读取文件,而不是模式,不幸的是,此文件夹中的所有文件都是一长行。

grep 可以在第一个匹配的模式后停止吗,或者我应该用其他东西来做这件事吗?

*奖金问题 - 能够将其输出为“匹配模式”'文件名'以便我对其进行排序?

最佳答案

据我所知,在 grep 中无法做到这一点。事实上,大多数 Unix 实用程序都顽固地基于行。例如,我不认为有一种方法可以在 sed 中只打印出一行的一部分。即使在 awk 中,也可能有一种方法可以将某些东西拼凑在一起,但我猜这不会令人满意。

不过,如果你的系统上有 GNU awk,试试这个:

gawk 'BEGIN {RS="pattern"} {print RT, FILENAME; exit}' filename

RS 将记录分隔符(通常是换行符)设置为模式。 RTRS匹配的文本。 FILENAME 是不言自明的。 exit 停止执行。因此,在第一条记录之后,awk 将打印模式文本和文件名,然后退出。这不适用于多个文件,因为此处的退出是无条件的。

如果你需要在一个目录结构中的所有文件上运行这个,使用findxargs,除非你找到了一些东西,否则不要退出:

find . -type f -print0 | xargs -0 gawk 'BEGIN {RS="pattern"} {print RT, FILENAME; if (RT != "") exit}'

这会打印出所有没有模式的文件名(前面有一个空格),但是当它遇到第一个模式时会打印出模式和文件名,然后停止。

当然,您需要小心使用此命令:由于记录分隔符可能根本不存在,gawk 可能会将文件的全部内容拖入其缓冲区,并且它可能会耗尽内存。 (当我在我的系统上测试它时,我在 490 MB 时失败了。)

关于regex - 匹配模式后停止 grep,而不是整行?长行/单行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5905154/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com