我知道一个字符串的两个部分,称为phrase1
和phrase2
,它们位于文件的同一行中,并在整个文件中多次出现。我需要从文件中提取这些行;但是,中间有一些我不知道的数字,而且这些行可能会有所不同。例如,有些行可能看起来像:
phrase1 654654 phrase2
phrase1 22 phrase2
phrase1 949 phrase2
etc.
但是,我知道我可以为特定行编写代码。例如,我可以为上面的第 2 行编写代码来找到它:
grep "phrase1 [0-9][0-9] phrase2" file
我可以使用 grep (或类似程序)编写什么代码来提取包含和的所有行phrase1
,phrase2
而不知道中间的数字或其他任何内容?
答案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]
。$
表示匹配行尾。