我需要一些类似于grep -A
和grep -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 选项说明:
- 表示
-r
以递归方式搜索文件和文件夹树 -n
说显示行号-i
说不区分大小写-o
说只显示匹配的部分,而不是整行-E
说使用扩展正则表达式
正则表达式解释:
看:https://regex101.com/r/BUpUdp/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
因为那命令可能在(长)非空白序列内中断(例如非常长的单词)。