我有一个文件,需要从中查找每个子字符串实例之前和之后的 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/