regex - 如何快速查找大字符串中的子字符串及其周围字符?

标签 regex linux bash grep substring

我有一个文件,需要从中查找每个子字符串实例之前和之后的 10 个字符。

例如,来自:

(1M characters)...ldkS9jfasdfalkasjFalskdfjsDljBASHcslakfjsalZkf4djfsa3Jkjl...(1M characters)

我想要输出:

lskdfjsDljBASHcslakfjsal

当然,文件中有很多该字符串的实例,我想以具有前一个和后 10 个字符的相同方式返回所有实例。

现在我正在使用grep,如下所示:

grep -o -P '.{0,10}BASH.{0,10}' input.txt > output.txt

虽然这有效,但似乎非常慢。有什么办法可以加快这个过程吗?提前致谢。

最佳答案

您会尝试以下操作吗:

grep -F 'BASH' input.txt | grep -o -E '.{10}BASH.{10}'

级联多个 grep 通常可能看起来像反模式,因为 设计不当的搜索模式。 在这种情况下,它的工作原理如下:第一个 grep 有效地缩小范围 包含带有 -F (固定)选项的目标单词的行; 然后第二个 grep 提取该单词周围的子字符串。

我生成了一个包含 100,000 列随机字符的文本文件 和 10,000 行(1GB)。这是基准测试结果 旧赛扬CPU:

time grep -o -P '.{0,10}BASH.{0,10}' input.txt
=> 2m48s

time grep -F 'BASH' input.txt | grep -o -E '.{10}BASH.{10}'
=> 0m20s

顺便说一句,令人惊讶的是,我在随机生成的字符串中发现了九个 BASH 字符串 ascii 文件。

[编辑]

如果您需要保持重叠匹配,请尝试:

grep -F 'BASH' file | perl -ne 'while (/(?=(.{10}BASH.{10}))/g) {print $1, "\n"}'

与上面的答案相比,它不需要额外的执行时间。

关于regex - 如何快速查找大字符串中的子字符串及其周围字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59366105/

相关文章:

linux - 如何在 Linux 中获取文件的最后一行前 2 个字符

linux - 有没有更好的方法从 arp 表中获取 mac 地址?

php - 正则表达式表示一个单词,但如果他们正在创建另一个单词,则避免使用它

regex - 为什么用。*正则表达式有两个匹配项?

regex - 是否有一个正则表达式来匹配包含A但不包含B的字符串

linux - 计算具有多列数据的文本文件的中值和平均值

java - 需要 java 正则表达式来获得特定的输出

linux - 通过不同的用户 SSH 到另一台主机

在 "perf"事件处捕获用户空间变量

bash - 在 Windows 10 bash 上连接到 Amazon EC2 实例 - 权限被拒绝(公钥)