【问题标题】:searching a multiple line pattern using grep regex使用 grep 正则表达式搜索多行模式
【发布时间】:2018-05-29 07:45:51
【问题描述】:

我对 linux 比较陌生,我想在文件中搜索以“Leonard is”开头并以“champion”结尾的模式

这个模式也可以放在多行中

输入文件(input.txt)可能如下所示:

1 rabbit eats carrot Leonard is a champion 
2 loin is the king of 
3 jungle Leonard is a 
4 Champion 
5 Leonard is An exemplary 
6 Champion

我希望我的模式的所有出现都忽略输出文件中模式以外的所有其他字符:

1 Leonard is a champion
3 Leonard is a
4 Champion
5 Leonard is An exemplary
6 Champion

我已经非常接近以下命令:

cat input.txt | grep -ioE "Leonard.*Champion$"

因为这个命令只返回

1 Leonard is a champion

忽略多行中出现的所有模式

如果 grep 以外的任何其他搜索方法有用,请告诉我谢谢!

【问题讨论】:

  • 重新格式化做得很好! :)
  • 试试grep -iPoz "(?m)Leonard.*?Champion$"(如果您使用的是GNU grep

标签: linux awk sed grep


【解决方案1】:

Perl 的救援:

perl -l -0777 -e 'print for <> =~ /(.*Leonard(?s:.*?)[Cc]hampion.*)/g' -- input.txt
  • -l 为打印添加换行符
  • -0777 读取整个文件而不是逐行处理
  • 菱形运算符&lt;&gt; 读取输入
  • .*? 就像.*,即它匹配任何东西,但? 意味着最短的匹配就足够了。这会阻止正则表达式匹配第一个 Leonard 和最后一个 Champion 之间的所有内容。
  • 正则表达式中的 . 通常不匹配换行符,但它与 s 修饰符匹配。 (?s:.*?) 将更改的行为本地化,因此其他点仍然不匹配换行符。

【讨论】:

  • 你的命令结果所有包含模式的行的文本意味着虽然我只想得到 Leonard 是冠军部分,但忽略它之前和之后的所有文本,除了我还想要一个忽略的标志LEONARD 的所有情况都可以 LeOnard 也一样 CHAMPION 谢谢!!!
  • @HammadAhmed:使用/i 修饰符以忽略大小写的方式进行匹配。要省略行开头和结尾,只需从正则表达式的开头和结尾删除.*
  • perl -l -0777 -e 'print for =~ /(Leonard(?s:.*?)[Cc]hampion)/gi' -- input.txt 很好用!! !谢谢!
  • @HammadAhmed:您可以将[Cc] 替换为c,因为/i 使其匹配Cc
  • 是的,我知道这被错误地忽略了,谢谢!!
【解决方案2】:

您正在寻找代表空白的\s+ 代表一个或多个

模式:Leonard is a\s+Champion

见:https://regex101.com/r/qiNXhf/1

我在使用这个工具时对正则表达式的了解为 0,它对我帮助很大。请参阅右下角的注释,其中解释了所有这些标志。

【讨论】:

    【解决方案3】:

    “.”被引用为“任何字符除了换行”,因此,你试图用 . 实现的目标是不可能的,我建议使用\s 也添加了 * 或 +(如上所述),但需要了解如何使用“grep”reg 表达式来实现它。还有一些不错的正则表达式测试工具——例如https://regexr.com/

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多