使用 grep (或类似工具) 查找特定字符串

使用 grep (或类似工具) 查找特定字符串

我知道一个字符串的两个部分,称为phrase1phrase2,它们位于文件的同一行中,并在整个文件中多次出现。我需要从文件中提取这些行;但是,中间有一些我不知道的数字,而且这些行可能会有所不同。例如,有些行可能看起来像:

phrase1 654654 phrase2
phrase1 22 phrase2
phrase1 949 phrase2

etc. 

但是,我知道我可以为特定行编写代码。例如,我可以为上面的第 2 行编写代码来找到它:

grep "phrase1 [0-9][0-9] phrase2" file

我可以使用 grep (或类似程序)编写什么代码来提取包含和的所有行phrase1phrase2而不知道中间的数字或其他任何内容?

答案1

如果你正在寻找的线条开始phrase1结尾那么phrase2我建议

grep "^phrase1.*phrase2$"

以下是使用的特殊字符列表

  • ^匹配行首
  • $匹配行尾
  • .匹配每个字符
  • *匹配前一个字符 0 次或多次

因此,基本上,grep查找以 开头phrase1,后跟 0 个或多个字符并以 结尾的行phrase2

答案2

两种方法:使用正则表达式:

grep "phrase1 .* phrase2" file

这将搜索短语 1、一个空格、一串字符(可以是任何您想要的字符)、另一个空格以及短语 2(位于行中的任意位置)(它匹配在“短语 1”之前和“短语 2”之后包含更多材料的行)

如果这两个短语必须位于行的开头和结尾,请参阅@AndreasT 的回答:您可以使用^$将正则表达式“锚定”在行的开头和结尾。

如果您只想匹配两个短语之间的数字,那么 minerz029 的答案是正确的;“[0-9]+”匹配数字重复(“+”表示“至少一个字符的序列”)。

如果你只想要数字phrase1 和 phrase2 必须位于短语的开始和结束处,将两者结合起来:

grep "^phrase1 [0-9]+ phrase2$" file

或者“技巧”/黑客......

grep "phrase1" file | grep "phrase2"

说明:第一个命令搜索 phrase1 的所有出现位置,然后将结果行“通过管道传输”到第二个 grep 中作为输入,输出与 phrase2 匹配的所有行。

然而,正如@AndreasT 所注意到的,第二种方法匹配反向的“phrase2...phrase1”模式,这可能是不受欢迎的。

答案3

使用此功能仅检测短语之间的数字:

grep -E '^phrase1 [0-9]+ phrase2$'

-E选项使用“扩展正则表达式”,增加了对+运算符的支持。

分解:

  • ^表示匹配行的开头。
  • +之后的[0-9]意思是搜索前面的表达式的一个或多个出现,在本例中是类[0-9]
  • $表示匹配行尾。

相关内容