如何使用grep查找具有部分周围上下文的单词?

FrE*_*qDe 3 command-line grep

我想使用 grep 来确定在搜索内容之前和之后应该显示多少个字符。例如,我想从“这是一个示例”行中过滤“示例”。通过使用grep example结果将是包含字符串的所有行,当我希望获得的只是“一个示例”,单词example之前的两个字符。

Arc*_*mar 13

有 grep 选项

grep -Eo '...example' test.txt
Run Code Online (Sandbox Code Playgroud)

在哪里

  • -E 使用扩展正则表达式
  • -o 只输出匹配的字符串
  • ... 表示任意 3 个字符
  • 两个选项都可以合并为 -Eo
  • ' ' 包含模式以避免外壳替换

正如建议的那样,3 个或更少字符的替代品

grep -Eo '.{,3}example' test.txt
Run Code Online (Sandbox Code Playgroud)

其中x{a,b}代表在 a 和 b 之间出现 x

  • .{,3} 最多 3 个任意字符
  • X{2,10} 从 2 到 10 个连续的 X(大写 X)
  • [xy]{5} 正好是 x 或 y 中的 5 个

关于外壳替换的说明

grep -Eo ???example file
Run Code Online (Sandbox Code Playgroud)

如果123example运行 grep 的目录中存在类似文件,则可能无法按预期工作。


小智 5

您可以将输出从 grep 传送到 sed。下面是一个例子:

grep example test.txt | sed 's/.*\(...example\)/\1/'
Run Code Online (Sandbox Code Playgroud)

有关 sed 教程,请参阅http://www.grymoire.com/Unix/Sed.html