如何让 grep 仅打印匹配的文本以及 X 周围的字符

如何让 grep 仅打印匹配的文本以及 X 周围的字符

我需要一些类似于grep -Agrep -B但用于字符的东西。换句话说,我有一个文件难以置信长行,例如:

[thousands of characters] mytext [thousands of characters]

如果我这样做grep mytext file,我不想要完整的行,因为如果我将它通过管道传输到文件中,它将变得太难阅读并导致文件太大。grep -o对我来说不起作用,因为它只返回mytext,我需要看到匹配周围的 X 个字符。所以想象一个假的选项-Y

$ grep -Y mytext file
Pz8mytextgxe
[email protected]

我该怎么做呢?

答案1

如果你预先知道 Y,那么你可以这样做

grep -o '...mytext...' file

其中...长度为 Y 个字符。例如,上述代码适用于 Y=3 的情况。正则表达式中的“.”字符可匹配任何字符。

答案2

如果您想要查找目标搜索字符串之前或之后的 0 到 10 个字符,请mytext执行以下操作:

grep -rnioE '.{0,10}mytext.{0,10}'

Grep 选项说明:

  1. 表示-r以递归方式搜索文件和文件夹树
  2. -n说显示行号
  3. -i说不区分大小写
  4. -o说只显示匹配的部分,而不是整行
  5. -E说使用扩展正则表达式

正则表达式解释:

看:https://regex101.com/r/BUpUdp/2

  1. .匹配除换行符之外的任何字符
  2. {0,10}匹配 0 到 10 个前面的字符,即.,或除换行符之外的任何字符

使用示例:

我想找到此网页颜色代码 ( #005cc5) 的任何实例,以确定它是否被使用。但是,CSS 实际上有 5000 行,全部在一行上,没有换行符,所以我只需要捕获一些周围的字符作为上下文——假设前后最多 20 个。因此,我搜索grep -rnioE '.{0,20}#005cc5.{0,20}'

$ grep -rnioE '.{0,20}#005cc5.{0,20}'
Test Syntax Highlighting _ GabrielStaples.com home_files/main.css:5:.highlight .l{color:#005cc5}.highlight .n{color
Test Syntax Highlighting _ GabrielStaples.com home_files/main.css:5:.highlight .m{color:#005cc5}.highlight .s{color
Test Syntax Highlighting _ GabrielStaples.com home_files/main.css:5:highlight .mf{color:#005cc5}.highlight .mh{colo
Test Syntax Highlighting _ GabrielStaples.com home_files/main.css:5:r:#005cc5}.highlight .mi{colo
Test Syntax Highlighting _ GabrielStaples.com home_files/main.css:5:r:#005cc5}.highlight .mo{colo
Test Syntax Highlighting _ GabrielStaples.com home_files/main.css:5:r:#005cc5}.highlight .sb{colo
Test Syntax Highlighting _ GabrielStaples.com home_files/main.css:5:highlight .se{color:#005cc5}.highlight .sh{colo
Test Syntax Highlighting _ GabrielStaples.com home_files/main.css:5:highlight .si{color:#005cc5}.highlight .sx{colo
Test Syntax Highlighting _ GabrielStaples.com home_files/main.css:5:highlight .il{color:#005cc5}.gist th,.gist td{b
Test Syntax Highlighting _ GabrielStaples.com home_files/main.css:5:highlight .nb{color:#005cc5}.highlight .nc{colo

带颜色的屏幕截图:

在此处输入图片描述

.m例如,上面的第二个匹配显示此颜色适用于CSS 类,因此我现在可以在代码中搜索使用此类的任何匹配项"m",这些匹配项可能会显示在某些*.html文件中。(下一个搜索似乎没有找到我想要的所有内容,但你明白了!上面的搜索工作正常。)

grep -rniE 'class="m[\s"]?'

答案3

您可以在实际搜索之前尝试应用换行(例如,换行到 80 个字符):

cat file | fmt -w 80 | grep mytext

这样做的缺点是,空格(例如空格与制表符)并不总是以其确切的形式保留,并且以前位于同一行的字符串现在可能位于相邻行。

这不起作用,fold因为命令可能在(长)非空白序列内中断(例如非常长的单词)。

相关内容